砝码称重(多重背包)
问题 AR: 砝码称重
题目描述
桐桐有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总质量≤1000)。她想知道用这些砝码能称出多少种不同的质量。
输入
只有1行:共6个数,分别为al,a2,a3,a4,a5,a6,表示1g砝码有a1个,2g砝码有a2个,...,20g砝码有a6个,每种砝码数量不超过10个。
输出
只有一个数:N,表示用这些砝码能称出的不同质量的个数,但不包括一个砝码也不用的情况。
样例输入
1 1 0 0 0 0
样例输出
3
提示
表示可以称出1g,2g,3g三种不同的质量。
分析
背包问题,检查能否恰巧达到某个值,注意状态转移方程dp[j] = dp[j] || dp[j-w[i]]
,不能直接使用dp[j] = dp[j-w[i]]
否则会覆盖原来的值,如果原来的值是可以达到的,可能被新值覆盖,造成错误
代码
``cpp
int dp[500000];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//
// freopen("E:/Code/C++/untitled1/input.txt","r",stdin);
// freopen("output.txt","w",stdout);
dp[0] = 1;
int w[7]{0,1,2,3,5,10,20};
for(int i = 1;i <= 6;++i)
{
int n;
cin >> n;
while (n--)
{
for(int j = 1000;j >= w[i];--j)
dp[j] |= dp[j-w[i]]; // 这里是dp[j] = dp[j] || dp[j-w[i]]
}
}
int ans = 0;
for(auto &c : dp)
if(c) ans++;
cout << ans -1;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战