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 }

 

posted @ 2013-03-27 22:22  ihge2k  阅读(209)  评论(0编辑  收藏  举报