完全背包问题 欢乐赛2B
链接:https://ac.nowcoder.com/acm/contest/16806/B
来源:牛客网
即可能存在金额x不能被该货币系统表示出。例如在货币系统n=3, a=[2,5,9]中,金额1,3就无法被表示出来。
两个货币系统(n,a)和(m,b)是等价的,当且仅当对于任意非负整数x,它要么均可以被两个货币系统表出,要么不能被其中任何一个表出。
将货币系统化简 找到m最小的货币系统
题解:
首先 不能额外的添加其他的货币数量,所以原系统最小的货币一定要使用,并且只能从原有的货币类型里进行化简(删除) 我们将原有货币系统排序,问题转变成,用已有的货币类型 能否表达这个新的货币[用n种体积为v的无限量物体,能不能填满背包] 变成了一个完全背包问题 然后进行循环即可(暴力搜索每一个值).
代码:
memset(f, 0, sizeof(f)); f[0] = 1; for (int i = 1; i <= n; i++) { if (f[a[i]] == 1) continue; cnt++; for (int j = a[i]; j <= a[n]; j++) if (f[j - a[i]]) f[j] = 1; }

浙公网安备 33010602011771号