dp学习笔记4
砝码称重:
View Code
1 /* 2 设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),用他们能称出的重量的种类数。 3 */ 4 /* 5 输入: 6 a1 a2 a3 a4 a5 a6 7 (表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个,中间有空格)。 8 */ 9 /* 10 样例输入: 11 1 1 0 0 0 0 12 正确输出: 13 3 14 */ 15 //分析:把问题稍做一个改动,已知a1+a2+a3+a4+a5+a6个砝码的重量w[i], w[i]∈{ 1,2,3,5,10,20} 16 //其中砝码重量可以相等,求用这些砝码可称出的不同重量的个数. 17 //这样一改就是经典的0/1背包问题的简化版了,求解方法完全和上面说的一样 18 //这里就不多说了,只是要注意这个题目不是求最大载重量,是统计所有的可称出的重量的个数。 19 20 21 #include<iostream> 22 #include<cstdio> 23 #include<cstring> 24 using namespace std; 25 26 int main(){ 27 int w[6]={1,2,3,5,10,20}; 28 int d[6]; 29 int dp[1001]; 30 memset(dp,0,sizeof(dp)); 31 int x; 32 for(int i=0;i<6;i++){ 33 scanf("%d",&x); 34 d[i]=w[i]*x; 35 } 36 for(int i=0;i<6;i++){ 37 for(int j=1000;j-w[i]>=0;j--){ 38 dp[j]=max(dp[j],dp[j-d[i]]+d[i]); 39 } 40 } 41 printf("%d\n",dp[1000]); 42 return 0; 43 }