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