sdau三 1018

问题:

有一扑满,有多种硬币,每种硬币价值重量不同,每种硬币数量无限。要把扑满装满,求扑满中的最少能装多少钱。

input:

输入n,后有n组事例,输入空扑满和装满钱的扑满的重量,输入m,后有m组硬币,各有价值v与重量w

out:

输出最小价值或输出不可能(若装不满)

simple input:

3 10 110 2 1 1 30 50 10 110 2 1 1 50 30 1 6 2 10 3 20 4
simple output:
The minimum amount of money in the piggy-bank is 60. The minimum amount of money in the piggy-bank is 100. This is impossible.
分析:

一定要装满的完全背包问题。求最小值,所以关键是要将dp数组初始化为正无穷,然后套完全背包模板就好

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int p,w,dp[10001];
const int INF=100000000000;
int main(){
    //freopen("s.txt","r",stdin);
    int t;
    cin>>t;
    while(t--){
        int s1,s2,s,n,i,j;
        cin>>s1>>s2;
        s=s2-s1;
        cin>>n;
        for(i=1;i<=s;i++)
            dp[i]=INF;
        for(i=1;i<=n;i++){
            cin>>p>>w;
            for(j=w;j<=s;j++)
                dp[j]=min(dp[j],dp[j-w]+p);
        }
        if(dp[s]!=INF)
            cout<<"The minimum amount of money in the piggy-bank is "<<dp[s]<<"."<<endl;
        else
            cout<<"This is impossible."<<endl;
    }
    return 0;
}


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭