hdu 1114Piggy-Bank(完全背包)

题意:给出存钱罐空和满的时候的重量,然后给出n种钱币,计算存钱罐满的时候存钱罐内最少有多少枚钱币

分析:完全背包问题,恰好装满,只要把dp[0]设为0,其他的设为INF(表示一个不可能达到的数,注意取得数不要再+-中超过精度)

这样就能保证值不为INF的都能找到一条从0到i的路径

#include<iostream>
using namespace std;
const int INF=0xFFFFFFF;
int dp[100010];

int main(){
    int E,F,v;
    int T;
    int n;
    int p,w;
    cin>>T;
    while(T--){
        cin>>E>>F;
        v=F-E;
        cin>>n;
        dp[0]=0;
        for(int i=1;i<=v;i++)
            dp[i]=INF;
        for(int i=0;i<n;i++){
            cin>>p>>w;
            for(int j=w;j<=v;j++)
                dp[j]=min(dp[j],dp[j-w]+p);
        }
        if(dp[v]!=INF)
            cout<<"The minimum amount of money in the piggy-bank is "<<dp[v]<<".\n";
        else
            cout<<"This is impossible.\n";
    }
    return 0;
}
View Code

 

posted @ 2017-03-15 15:23  N维解析几何  阅读(99)  评论(0编辑  收藏  举报