HDOJ HDU 1114 Piggy-Bank
题目
分类
动态规划 完全背包问题
题意
求 可以把 存钱罐装满的 硬币 的最低价值
n组测试用例
E F 存钱罐 空满 的 质量
m 硬币的种数
P W 接下来m行每种硬币的价格 和 质量
题解
求 装几种硬币的最值 一看就是背包 问题
其次 背包要装满 则为 完全背包问题
i 是 第i种硬币 w[i]是i的价值 v[i]是 i的重量
j 是当前背包重量容量
动态转移方程
dp[i][j] = min(dp[i-1][j],dp[i][j - v[i]] + w[i])
即 可以放下 j 重量 的 背包的最小价值 是 放 i-1 硬币 的价值 和放 i 硬币的最小值
完全背包
将数组 初始化 为 正无穷
如果没有刚好装满 动态规划过程进行完 则 其任为 无穷
代码
#include <iostream>
#include <cstring>
#define inf 0x3f3f3f3f
#define maxn 10000
#define maxm 500
using namespace std;
int dp[maxn+1];
int v[maxm+1];
int w[maxm+1];
int init(int mn);
int main()
{
int n,s,e,m,vm;
cin >> n;
while(n--)
{
memset(dp,0x3f,sizeof(dp));
dp[0] = 0;
cin >> s >> e;
vm = e-s;
cin >> m;
for(int i = 1;i <= m;i++)
cin >> w[i] >> v[i];
for(int i = 1;i <= m;i++)
for(int j = v[i];j <= vm;j++)
{
dp[j] = min(dp[j],dp[j-v[i]] + w[i]);
}
if(dp[vm] == inf)
cout << "This is impossible." << endl;
else
cout << "The minimum amount of money in the piggy-bank is " << dp[vm] << "." << endl;
}
return 0;
}