ZCMU--5239: 砝码称重(C语言)

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;
} 


版权声明:本文为qq_63739337原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。