POJ 1384(DP初步_D题)解题报告
题目链接:http://poj.org/problem?id=1384
--------------------------------------------------------
题意: n种硬币,每种特定的重量cost[i] 克和对应的价值val[i]. 已知储蓄罐总重量正好为m克, 求最少有多少价值的硬币? 如果不可能存在m克的情况, 那么就输出” This is impossible.”
思路:完全背包问题:
初始化: 所有dp都为INF(无穷大), 且dp[0]==0. (因为本题的目标是价值最小,所以初始化为无穷大. 如果要让目标最大, 那么应该初始化为-1. )
状态转移: dp[j] = min( dp[j] , dp[j-cost[i]]+val[i])
最终所求为dp[m]. (如果d[m]==INF, 说明m克是一个不可达的状态,输出 "This is impossible.")
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; int T =0; const int MAXN = 500+10; const int maxt = 1e4+10; int f[maxt]; const int INF =1e9; int main(void){ scanf("%d",&T); for(int t=0;t<T;t++){ int E,F; scanf("%d %d",&E,&F); int N; scanf("%d",&N); int val[N],wei[N]; for(int j=0;j<N;j++){ scanf("%d %d",&val[j],&wei[j]); } for(int p=0;p<maxt;p++){ f[p]=INF; } f[0]=0; int M = F-E; for (int i=0; i<N; i++){ for (int j=0; j<=M; j++){ if (wei[i]<=j){ f[j]=min(f[j],f[j-wei[i]]+val[i]); } } } if(f[M]!=INF){ printf("The minimum amount of money in the piggy-bank is %d.\n",f[M]); }else{ printf("This is impossible.\n"); } } return 0; }

浙公网安备 33010602011771号