砝码称重V2

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=100,000),要求:计算用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况。

输入
一行,包括六个正整数a1,a2,a3,a4,a5,a6,表示1g砝码有a1个,2g砝码有a2个,……,20g砝码有a6个。相邻两个整数之间用单个空格隔开。
输出
以“Total=N”的形式输出,其中N为可以称出的不同重量的个数。
样例输入
1 1 0 0 0 0
样例输出
Total=3
提示
      样例给出的砝码可以称出1g,2g,3g三种不同的重量。
  
  转化成多重背包类型的就可以了
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[10];
 4 int h[10];
 5 bool f[200000];
 6 int ans;
 7 int sum;
 8 int main(){
 9     a[1]=1; a[2]=2; a[3]=3; a[4]=5; a[5]=10; a[6]=20;
10     for(int i=1;i<=6;i++) scanf("%d",&h[i]),sum+=a[i]*h[i];
11     f[0]=true;
12     for(int i=1;i<=6;i++){
13         for(int v=sum;v>0;v--){
14             for(int k=0;k<=h[i];k++){
15                 if(k*a[i]<=v&&f[v-k*a[i]]==true){
16                     f[v]=true;
17                 }
18             }
19         }
20     }
21     for(int i=1;i<=sum;i++){
22         if(f[i]==true) ans++;
23     }
24     cout<<"Total="<<ans;
25     return 0;
26 } 

 

posted @ 2015-10-24 14:35  CXCXCXC  阅读(493)  评论(0编辑  收藏  举报