1714 - 砝码称重

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

    设有1g2g3g5g10g20g的砝码各若干枚(其总重1000g),编程求出能称出重量的个数。

题目输入

a1   a2   a3   a4   a5   a6(分别表示1g砝码有a1个,2g砝码有a2个,......20g砝码有a6)

题目输出

一行:一个整数(表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况

输入/输出样例

输入格式

1  1  0   0   0   0

输出格式

3

C语言解答

#include "stdio.h"
int a[]={1,2,3,5,10,20};
int b[6],f[1001];
int t,s;
int main()
{
	int i,j,k;
	s=t=0;
	for(i=0;i<6;i++)
	{
		scanf("%d",&b[i]);
		s+=a[i]*b[i];
	}
	f[0]=1;
	for(i=0;i<6;i++)
	{
		if(b[i]==0)
			continue;
		k=1;
		while(k<b[i])
		{
			for(j=s;j>=k*a[i];j--)
			{
				if(f[j])
					continue;
				if(f[j-k*a[i]])
					f[j]=1,t++;
			}
			b[i]-=k;
			k*=2;
		}
		k=b[i];
		for(j=s;j>=k*a[i];j--)
		{
			if(f[j])
				continue;
			if(f[j-k*a[i]])
				f[j]=1,t++;
		}
	}
	printf("%d\n",t);
	return 0;
}

C++解答

#include<iostream>
using namespace std;
const int w[7]={0,1,2,3,5,10,20};
int num[7],f[1001];
bool can[1001];
//ifstream cin("fama.in");
//ofstream cout("fama.out");
int main()
{
    while (cin>>num[1]>>num[2]>>num[3]>>num[4]>>num[5]>>num[6])
    {   
        fill(can,can+1001,0);
        f[0]=1;  f[1]=0;  can[0]=true;
        for (int i=1;i<=6;i++)
        {
            int total=f[0];     //已经求出的重量数量 
            for (int j=1;j<=total;j++)
                for (int k=1;k<=num[i];k++)                            
                    if  (!can[f[j]+k*w[i]])
                    {
                        can[f[j]+k*w[i]]=true;
                        f[0]++;
                        f[f[0]]=f[j]+k*w[i];
                    }           
        }
        cout<<f[0]-1<<endl;
    }
   // system("pause");
    return 0;
}