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;

}
View Code

 

posted @ 2018-01-30 15:57  caomp  阅读(115)  评论(0)    收藏  举报