最新文章

这里会显示最新的几篇文章摘要。

砝码称重(多重背包)

问题 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]]否则会覆盖原来的值,如果原来的值是可以达到的,可能被新值覆盖,造成错误

代码

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 @ 2025-02-22 17:10  bakul  阅读(31)  评论(0)    收藏  举报