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


    • 2
      点赞
    • 5
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值