砝码称重(多重背包)

问题 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;

}

posted @   bakul  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示