A1104. 砝码称重
时间限制:
1.0s 内存限制:
256.0MB
试题来源
NOIP1996 提高组
问题描述
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000)
输入格式
a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出格式
Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
样例输入
1 1 0 0 0 0
样例输出
Total=3
数据规模和约定
总重<=1000
评测链接:http://www.tsinsen.com/A1104
解析:裸的多重背包,不会的话请参考《背包九讲》。
代码:
#include<cstdio>
#define maxn 1000
using namespace std;
int s[6],v[6]={1,2,3,5,10,20};
bool f[maxn+100];
int main()
{
int i,j,k,sum=0;
for(i=0;i<6;i++)
scanf("%d",&s[i]),sum+=(v[i]*s[i]);
for(f[0]=1,i=0;i<6;i++)
for(j=1;j<=s[i];j++)
for(k=sum;k>=v[i];k--)
if(f[k-v[i]])f[k]=1;
for(k=0,i=1;i<=sum;i++)if(f[i])k++;
printf("Total=%d\n",k);
return 0;
}