最新文章
这里会显示最新的几篇文章摘要。
记录生活,分享知识,与你一起成长。
这里会显示最新的几篇文章摘要。
问题 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;
}