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     

 

你可能感兴趣的:(HDU)