砝码称重 NOIP1996TG
设有1g,2g,3g,5g,10g,20g的砝码各若干枚(其总重≤1000g),要求: 输入 a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个) 输出 Total=N (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)simple input
1 1 0 0 0 0
simple output
3
【解题思路】
类似于装箱问题,f[i]表示i这个重量可不可以组合出来,是一个布尔型的数组(这里用int型做了);
先把读入的数据转化一下,存放在一个数组里,然后做一遍简单的背包问题就OK了;
【代码】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int i,n,k,m,ans,v;
int w[1005],f[1005],a[6];
int main()
{
freopen("weight.in","r",stdin);
freopen("weight.out","w",stdout);
a[1]=1;a[2]=2;a[3]=3;a[4]=5;a[5]=10;a[6]=20;
for (i=1;i<=6;++i)//将读入的数据进行转化
{
scanf("%d",&k);
while (k>0)
{
n++;
w[n]=a[i];
m+=w[n];//m是重量和
k--;
}
}
f[0]=1;
for (i=1;i<=n;++i)
for (v=m;v>=w[i];--v)
f[v]=f[v]||f[v-w[i]];
for (i=1;i<=m;++i)
if (f[i])
ans++;
printf("Total=%d",ans);
return 0;
}