题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114
题目翻译:
有一个存钱罐,然后ACMer经常将自己的零钱投进去,但是这个存钱罐中的钱不能取出来,
除非把这个存钱罐砸掉,现在举办比赛需要一定的钱,需要从存钱罐中拿钱,但是把所有
的罐都砸掉来看钱够不够是不明智的,所以每组数据给出空存钱罐的重量,给出装了钱后
的存钱罐的重量,然后给出该罐里面存放的钱币的种类,给出每个钱币的重量和价值。
求存钱罐总的最少的可能的钱数。
完全背包入门题目。
AC代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int inf = 0x7f7f7f7f;
int N,E,F,V;
int weight[510],price[510]; ///重量和价格。
long long dp[10020];
void CompletePack(int i) {
for(int j = weight[i]; j <= V; j++) {
dp[j] = min(dp[j],dp[j-weight[i]] + price[i]);
}
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&E,&F);
scanf("%d",&N);
V = F-E;
for(int i = 1; i <= N; i++) {
scanf("%d%d",&price[i],&weight[i]);
}
for(int i = 0; i <= V; i++) {
dp[i] = inf;
}
dp[0] = 0;
for(int i = 1; i <= N; i++) {
CompletePack(i);
}
if(dp[V] < inf) {
printf("The minimum amount of money in the piggy-bank is %lld.\n",dp[V]);
} else {
printf("This is impossible.\n");
}
}
return 0;
}