题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1114
题意:
T组数据
输入E,F。E是空储蓄罐的质量,F是装了硬币的储蓄罐的质量
储蓄罐里面有n种货币
每种货币的价值是p,质量是w
求储蓄罐的最小价值
解题思路:
01背包 逆序
完全背包 顺序
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
#define ll __int64
struct node
{
int val,w;
}p[505];
int dp[1000005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int E,F,n;
scanf("%d%d",&E,&F);
F = F-E;
for(int i=0;i<=F;i++)
{
dp[i] = 10000000;
}
dp[0]=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&p[i].val,&p[i].w);
}
for(int i=0;i<n;i++)
{
for(int j=p[i].w;j<=F;j++)
{
dp[j] = min(dp[j],dp[j-p[i].w]+p[i].val);
}
}
if(dp[F] == 10000000)
{
printf("This is impossible.\n");
}
else
{
printf("The minimum amount of money in the piggy-bank is %d.\n",dp[F]);
}
}
return 0;
}