问题描述:
一个存钱罐能装一定重量的硬币,现在给你几组数据,每组数据有两个整数构成,
第一个整数表示硬币的金额,第二个表示重量。问存钱罐在不超载的情况下能装
多少金额的硬币。
输入数据:
3 //总共有多少个测试案例
10 110 //存钱罐的净重和最大承载量
2 // 有两种硬币
1 1 // 金额为1,重量为1
30 50
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
#include<vector>
#include<set>
using namespace std;
#define X first
#define Y second
#define PI 3.1415926
const int INF = 0x3f3f3f3f;
const int MAX = 2000000;
int p[MAX], w[MAX];
long long dp[MAX];
int main(){
int t;
cin >> t;
while(t--){
int E, F;
cin >> E >> F;
//净载量
int P = F - E;
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> p[i] >> w[i];
}
//初始化
memset(dp, INF, sizeof(dp));
dp[0] = 0;
//dp[j]表示前i个物品中挑选出价值总和为j时总重量的最小值
//不存在的话就是一个充分大的数INF
for(int i = 0; i < n; i++){
for(int j = w[i]; j <= P; j++){
dp[j] = min(dp[j], dp[j-w[i]] + p[i]);
}
}
if(dp[P] < INF){
printf("The minimum amount of money in the piggy-bank is %d.\n", dp[P]);
}else{
printf("This is impossible.\n");
}
}
return 0;
}