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由于需要四个砝码才能称出,故不计入答案。
学习了一下同学的代码。
解析:数据比较小,我们可以之间开1000000的数组来存是否能称出该值的重量,直接暴力干起来。例如a[1]=3,a[2]=4,我们可以称出a[1]+a[2]=7重量。因此我们分三种情况,一个砝码,二个砝码,三个砝码,分别利用for来存哪些重量可以实现。
#include <stdio.h>
int a[305],b[1000005];
int main()
{
int n,w,i,s,z,cnt=0;
scanf("%d%d",&n,&w);
for(i=0;i<n;i++) scanf("%d",&a[i]),b[a[i]]=1; //单个砝码
for(i=0;i<n;i++){
for(s=i+1;s<n;s++){ //取两个砝码时
if(a[i]+a[s]<=w) b[a[i]+a[s]]=1; //为了防止越界,我们前面加个判断,不大于w的时候存
} //大于w的反正也是无效的
}
for(i=0;i<n;i++){
for(s=i+1;s<n;s++){
for(z=s+1;z<n;z++){ //三个砝码时
if(a[i]+a[s]+a[z]<=w) b[a[i]+a[s]+a[z]]=1;
}
}
}
for(i=1;i<=w;i++) if(b[i]==1) cnt++; //存在该重要,cnt+1
printf("%d\n",cnt);
return 0;
}