小编sar*_*306的帖子

用有限数量的硬币更换硬币

我编写了一个用于生成子集和的程序,该程序可能会在此问题中使用,该程序指出:

假设你有3个1美元硬币,2个2美元硬币,3个5美元硬币,1个10美元硬币,有4种方法从这些硬币中获得10美元.如果有n1 $ X1币,n2 $ X2币...... nm $ Xm币,我们有多少种方法可以从这些有限数量的硬币中获得$ X?

如果我们创建一组{X1,X1 ..... X1,X2,X2 .......... X2,...,...,.......... ..,Xm,Xm ... Xm},然后对它运行Subset求和,当然我们可以得到$ X的结果.但是我找不到使用集合{n1,n2,n3 ...... nm},{X1,X2,X3 ...... Xm}的方法.一位朋友告诉我,这是背包问题的变种,但我不确定,怎么样.

这是我写的部分代码:

ways[0]=1, mylim=0;
for(i=0;i<count;i++){
    if(mylim+coins[i]<=LIMIT) mylim+=coins[i];
    else mylim=LIMIT;

    for(j=mylim; j>=coins[i];j--){
        ways[j]=(ways[j]+ways[j-coins[i]])%MOD;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你能够精心解释一下,那对我来说会很棒.

编辑:这个问题更适合计算机科学的堆栈交换,但由于这是我的一个老问题,我宁愿在这里编辑它.

这个问题可以通过包含排除原则来解决,当我们固定硬币值但每个硬币的数量随每个查询而变化时,它会派上用场.

假设,方法[v]是使用$ x1,$ x2,.. $ xm制作$ v的方法,每种方法根据需要多次使用.现在,如果我们只使用N1的数字$ X1,我们必须减去至少使用(配置N1 + 1)号的$ X1(这实际上是方法 [ N - (N1 + 1)×1 ]).此外,如果我们只使用N2的数字 …

c algorithm knapsack-problem dynamic-programming coin-change

5
推荐指数
1
解决办法
1万
查看次数