完全背包问题 欢乐赛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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步