题目
给定一组钱币,每张钱币可以使用任意张,求使用这些钱币能凑成价值K的方法数。
例如[100,10,50]凑成1000。
解题思路
根据全排列的思想,求出所有钱币的组合,找出其中组合的价值为K的次数,即为所求。
例如[100,10,50],K为1000
0 0 1 - 只使用1张50,和为50
0 0 2 - 使用2张50,和100
0 0 3 - 使用3张50,和150
...
0 0 20 - 使用20张50,和1000 (找到一种解)
0 1 0 - 只使用1张10元,和10
0 1 1 - 使用1张10元和1张50,和60
0 1 2 - 使用1张10元和2张50,和110
0 1 3 - 使用1张10元和3张50,和160
...
0 1 19 - 使用1张10元和19张50,和960
0 1 20 - 使用1张10元和20张50,和1010(溢出,大于了K)
0 2 0 - 使用2张10元,和20
...
根据这样的方式罗列出所有的组合,找出其中和等于K的组合。
代码
//coins数组表示所有的钱币,K表示要凑够的价值
//index表示当前遍历到第几号钱币,cur表示当前使用钱币的总和
int rec(int[] coins,int K,int index,int cur){
if(cur == K){
return 1;
}
//钱币用完了
if(index == coins.length){
return 0;
}
int res = 0;
//num为使用第index号钱币的数量
//num*coins[index] <= K 表示使用num数量的第index号钱币没有超过总价值K
for(int num = 0;(num*coins[index] <= K);num++){
res += rec(coins,K,index+1,cur+num*coins[index]);
}
return res;
}