HDU1114+完全背包

完全:

题意:给定E,F,分别表示空的存钱罐的重量和装了钱之后的重量。

给定n种money的价值和重量

dp[ i ][ j ]:表示从前 i 种money中选出某些,使得重量至少为 j 得到的最大价值。

View Code
 1 /*
 2 完全背包 变形
 3 */
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 #include<string.h>
 7 #include<iostream>
 8 #include<algorithm>
 9 #include<queue>
10 #include<map>
11 #include<math.h>
12 using namespace std;
13 const int maxn = 10005;
14 const int inf = 99999999;
15 int main(){
16     int T;
17     scanf("%d",&T);
18     while( T-- ){
19         int E,F;
20         scanf("%d%d",&E,&F);
21         int sum=0;
22         int dp[ maxn ];
23         int w[ maxn ],val[ maxn ];
24         int n;
25         scanf("%d",&n);
26         for( int i=0;i<n;i++ ) {
27             scanf("%d%d",&val[ i ],&w[ i ]);
28             sum+=val[ i ];
29         }
30         for( int i=0;i<maxn ;i++ ) dp[ i ]=inf;
31         dp[ 0 ]=0;
32         for( int i=0;i<n;i++ ){
33             for( int j=w[i];j<=(F-E);j++ ){
34                 dp[j]=min(dp[j],dp[j-w[i]]+val[i]);
35             }
36         }
37         //for( int i=50;i<105;i++ ) printf("dp[%d]:%d\n",i,dp[i]);
38         if( dp[ F-E ]!=inf ) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F-E]);
39         else printf("This is impossible.\n");
40     }
41     return 0;
42 }
43         
44     

 

posted @ 2012-12-14 19:05  xxx0624  阅读(604)  评论(0编辑  收藏  举报