noip1996 砝码称重 - 提高组 (多重背包)

A1104. 砝码称重
时间限制: 1.0s   内存限制: 256.0MB  
总提交次数: 1777   AC次数: 588   平均分: 47.06
将本题分享到:
       
   
查看未格式化的试题    提交    试题讨论
试题来源
  NOIP1996 提高组
问题描述
  设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000)
输入格式
  a1 a2 a3 a4 a5 a6
  (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出格式
  Total=N
  (N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
样例输入
1 1 0 0 0 0
样例输出
Total=3
数据规模和约定
  总重<=1000


评测链接:http://www.tsinsen.com/A1104

解析:裸的多重背包,不会的话请参考《背包九讲》。

代码:

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


你可能感兴趣的:(noip1996 砝码称重 - 提高组 (多重背包))