标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18924 Accepted Submission(s): 9579
///分析:每种物品无限多,可以分析出来是个完全背包问题.dp[i]代表钱罐重量为i时能够装的最少价值。 ///状态转移方程 dp[i] = min(dp[i],dp[i-V[i]]+W[i]) 其中V[i]是正向枚举的,因为每种物品无限多. #include<stdio.h> #include<algorithm> #include<string.h> #include<iostream> #include <math.h> #define N 10005 using namespace std; int dp[N]; int V[505],W[505]; int INF = 99999999; int main() { int tcase ; scanf("%d",&tcase); while(tcase--){ int E,F,n; scanf("%d%d",&E,&F); F-=E; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&W[i],&V[i]); } for(int i=1;i<=F;i++) dp[i] = INF; dp[0] = 0; ///初始化重量为0的背包能够装的最大价值为0 for(int i=1;i<=n;i++){ for(int v=V[i];v<=F;v++){ dp[v] = min(dp[v],dp[v-V[i]]+W[i]); } } if(dp[F]<INF) printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F]); else printf("This is impossible.\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5396680.html