引数として渡される特定の量になる最小の数値グループを見つけることを期待して、配列として与えられた数値のすべての可能な組み合わせを探索する関数を作成しようとしています。
これが私が行ってきたことです。これは、すべてのケースではなく一部のケースで機能しているようです。
数値を選択し、合計から減算し、配列の制限をそのままにして、新しい合計を関数に渡します。これにより、数値を再選択するオプションが与え
られ、2 番目の呼び出しで新しい合計を渡します。 、つまり、合計から現在選択されている数値を引いたものですが、配列を1つ小さくします。つまり、同じ数値を再度選択することはありません。
ただし、すべての選択肢をカバーしているわけではないことに気付きました。いずれにせよ、ソリューションには任意の数が不可欠であると想定しているためですが、3 番目のオプションをカバーするためにどの引数を渡せばよいかわかりません。 、これは数を選択していない、つまり合計から減算されていないことを意味し、配列のサイズを縮小しています。
あなたの助けは大歓迎です.ところで、私はCで書いています.
int howManyCoins(int*coins,int size,int sum)
{
return howManyCoins_aux(coins,size,sum,size-1);
}
int howManyCoins_aux(int*coins,int size, int sum,int chosen)
{
if (sum==0)return 1;
if (sum<0)return 0;
if (chosen==0) return 0;
if (coins[chosen]>sum) return 0;
int res1=0,res2=0,best_solution=0;
for (int i=chosen;i>=0;i--)
{
res1+=howManyCoins_aux(coins,size,sum-coins[i],chosen);
res2+=howManyCoins_aux(coins,size,sum-coins[i],chosen-1);
if(!(res1+res2)) best_solution=0;
else if (res1==0) best_solution=res2;
else if (res2==0) best_solution=res1;
else best_solution=res2>res1?res1:res2;
}
return best_solution;
}