HDOJ HDU 1114 Piggy-Bank

HDOJ HDU 1114 Piggy-Bank

题目

点此查看 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 
#include 
#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;
}

你可能感兴趣的:(-----------HDOJ,题目-----------,动态规划,题目)