暴力递归-完全背包

题目

给定一组钱币,每张钱币可以使用任意张,求使用这些钱币能凑成价值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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LXJ6379

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值