我是靠谱客的博主 醉熏月饼,最近开发中收集的这篇文章主要介绍HDU1114 存钱罐 完全背包,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1114

给你一个存钱罐的空的质量和存满钱的质量,给你每种硬币的质量和价值,让你算出它的最小价值。

  
  
3 10 110 2 1 1 30 50 10 110 2 1 1 50 30 1 6 2 10 3 20 4
 

Sample Output
  
  
The minimum amount of money in the piggy-bank is 60. The minimum amount of money in the piggy-bank is 100. This is impossible.
思路:这道题是一道完全背包的题,不限制硬币的数量,求在一定重量内最小价值。这里使用了没有优化的背包。

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int dp[505][10005];
const int inf = (1 << 30) - 1;
int main()
{
    int T,n,i,v,w,l,h,j;
    int p[505], m[505];
    cin >> T;
    while (T--)
    {
        cin >> l >> h>>n;
        h -= l;
        memset(p, 0, sizeof(p));
        memset(m, 0, sizeof(m));
        for (i = 0; i < n; i++)
            cin >> p[i] >> m[i];
        for (i = 0; i <=n; i++)
        {
            for (j = 0; j <= h; j++)
            {
                if ( j == 0)
                    dp[i][j] = 0;
                else dp[i][j] = inf;
            }
        }
        for(i=0;i<n;i++)
        {
            for ( j = 0; j <=h; j++)
            {
                    if (m[i] > j)
                        dp[i + 1][j] = dp[i][j];
                    else
                    dp[i + 1][j] = min(dp[i][j], dp[i + 1][j - m[i]] + p[i]);
            }
        }

        if (dp[n][h] == inf)printf("This is impossible.n");
        else
            printf("The minimum amount of money in the piggy-bank is %d.n", dp[n][h]);
    }
    return 0;
}



最后

以上就是醉熏月饼为你收集整理的HDU1114 存钱罐 完全背包的全部内容,希望文章能够帮你解决HDU1114 存钱罐 完全背包所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部