题目大意是说有1g、2g、3g、5g、10g、20g的砝码各若干枚,问可以称出多少种不同的重量
本题首先想到DP,重量为i的物品显然可以由重量为i-w[1~6]的物品得到(前提是w[1~6]的数量足够)
但这样的方法显然会出现冲突,因此我们采用了一种十分玄学的做法。
对于每一个砝码,都可以称出当前已经称出的重量+当前砝码重量的物品。因此,这道题并非单纯的枚举物品重量,而应枚举砝码重量和已经称出的物品。
故本题的状态转移方程为:f[i+a[k]]=f[i]。(这个不需要解释吧)
直接上代码:
#include <bits/stdc++.h>
using namespace std;
int a[1005],f[1005],v[]={0,1,2,3,5,10,20};
int ans,num,tot,maxtot;
int main()
{
f[0]=1;
for(int i=1;i<=6;i++){
cin >> num;
for(int j=1;j<=num;j++) a[++tot]=v[i];
maxtot+=num*v[i];
}
f[0]=1;
for(int k=1;k<=tot;k++){
for(int i=maxtot;i>=0;i--)
if(f[i]) f[i+a[k]]=1;
}
for(int i=1;i<=maxtot;i++)
ans+=f[i];
cout << "Total=" << ans << endl;
return 0;
}
ps:由于作者是一名资深蒟蒻,有错误也是不可避免的事,所以欢迎大家指出错误,我也会改正的,谢谢。