其他分享
首页 > 其他分享> > 暴力递归-完全背包

暴力递归-完全背包

作者:互联网

题目

给定一组钱币,每张钱币可以使用任意张,求使用这些钱币能凑成价值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,背包,暴力,递归,index,int,50,钱币,使用
来源: https://blog.csdn.net/weixin_52980648/article/details/121375190