现有n个砝码,第i个砝码的重量为ai,你至多能选择三个砝码进行称重,请问对于1~w中的所有整数,有多少数字能被这n个砝码称出来?
Input单组测试数据,第一行输入两个正整数n(1≤n≤300),w(1≤w≤1000000),第二行输入n个正整数ai(1≤ai≤1000000),含义如题所述。
Output输出1~w能被称出来的数量。
Sample Input4 12
3 3 3 3
Sample Output3
HINT对于样例,只有3,6,9这三个整数能被称出来。
3=a1
6=a1+a2
9=a1+a2+a3
注意12由于需要四个砝码才能称出,故不计入答案。
SourceC语言练习题
_____________________________________________________________________________
思路:将w范围内的砝码利用map存入wt中,再利用三重循环暴力列举在w值内可用砝码组成的重量,再次利用wt记录。最后利用迭代器遍历map,对不同重量进行计数。
#includeusing namespace std; int main() { ios::sync_with_stdio(false); int n,w; cin>>n>>w; int a[n+1]; map wt;//wt记录可能组成的重量 memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { cin>>a[i]; if(a[i]<=w)//如果该砝码符合条件则提前存入wt wt[a[i]]=1; } for(int i=0;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=j+1;k<=n;k++) if(a[i]+a[j]+a[k]<=w&&wt[a[i]+a[j]+a[k]]==0)//三重循环考虑多个砝码组成的重量 { //cout<::iterator it;//利用迭代器遍历map int cnt=0; for(it=wt.begin();it!=wt.end();it++) { if(it->second) { //cout< first<


![[ZCMU OJ]5239: 砝码称重(暴力循环/map遍历) [ZCMU OJ]5239: 砝码称重(暴力循环/map遍历)](http://www.mshxw.com/aiimages/31/892549.png)
