砝码称重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 }