HDU1114 Piggy-Bank 【全然背包】

Piggy-Bank

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11149    Accepted Submission(s): 5632
Problem Description
Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income for this action comes from Irreversibly Bound Money (IBM). The idea behind is simple. Whenever some ACM member has any small money, he takes all the coins and throws them into a piggy-bank. You know that this process is irreversible, the coins cannot be removed without breaking the pig. After a sufficiently long time, there should be enough cash in the piggy-bank to pay everything that needs to be paid.

But there is a big problem with piggy-banks. It is not possible to determine how much money is inside. So we might break the pig into pieces only to find out that there is not enough money. Clearly, we want to avoid this unpleasant situation. The only possibility is to weigh the piggy-bank and try to guess how many coins are inside. Assume that we are able to determine the weight of the pig exactly and that we know the weights of all coins of a given currency. Then there is some minimum amount of money in the piggy-bank that we can guarantee. Your task is to find out this worst case and determine the minimum amount of cash inside the piggy-bank. We need your help. No more prematurely broken pigs!

Input
The input consists of T test cases. The number of them (T) is given on the first line of the input file. Each test case begins with a line containing two integers E and F. They indicate the weight of an empty pig and of the pig filled with coins. Both weights are given in grams. No pig will weigh more than 10 kg, that means 1 <= E <= F <= 10000. On the second line of each test case, there is an integer number N (1 <= N <= 500) that gives the number of various coins used in the given currency. Following this are exactly N lines, each specifying one coin type. These lines contain two integers each, Pand W (1 <= P <= 50000, 1 <= W <=10000). P is the value of the coin in monetary units, W is it's weight in grams.
Output
Print exactly one line of output for each test case. The line must contain the sentence "The minimum amount of money in the piggy-bank is X." where X is the minimum amount of money that can be achieved using coins with the given total weight. If the weight cannot be reached exactly, print a line "This is impossible.".
Sample Input
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.

题意:给定一个空储钱罐的重量和满储钱罐的重量。再给定一些硬币种类的价值和重量。每一种硬币都有无数个。问:在储钱罐里如何放硬币能使得总价值最小且总重量正好和满储钱罐重量相等。

题解:全然背包入门题。状态转移方程为dp[i][j] = min(dp[i-1][j-k*w[i]] + k*v[i]) 0<=k<=totalWeight/w[i],跟01背包一样,全然背包dp数组也能够压缩成一维数组。

仅仅只是内层循环要顺序。而01背包是逆序

另外这题在初始化dp数组时有个陷阱:对于在函数外定义的数组。若对它使用memset(dp + 1, -1, sizeof(dp + 1));那么将仅仅有一个元素被初始化为-1,其余的全为0.可是若是memset(dp, -1, sizeof(dp));数组就能够所有初始化为-1。

#include <stdio.h>
#include <string.h>int dp[10002];int main()
{int totalWeight, weight, val, n, t, i, j;scanf("%d", &t);while(t--){scanf("%d%d", &weight, &totalWeight);totalWeight -= weight;scanf("%d", &n);memset(dp + 1, -1, sizeof(int) * 10001); for(i = 1; i <= n; ++i){scanf("%d%d", &val, &weight);for(j = weight; j <= totalWeight; ++j){if(dp[j - weight] != -1){if(dp[j] == -1 || dp[j] > dp[j - weight] + val)dp[j] = dp[j - weight] + val;}}}if(dp[totalWeight] == -1) printf("This is impossible.\n");else printf("The minimum amount of money in thepiggy-bank is %d.\n",dp[totalWeight]);}return 0;
}

posted on 2017-05-14 09:24 mthoutai 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/mthoutai/p/6851628.html

HDU1114 Piggy-Bank 【全然背包】相关推荐

  1. piggy bank 完全背包

    题目描述 Before ACM can do anything, a budget must be prepared and the necessary financial support obtai ...

  2. 01背包模板、全然背包 and 多重背包(模板)

    转载请注明出处:http://blog.csdn.net/u012860063 贴一个自觉得解说不错的链接:http://www.cppblog.com/tanky-woo/archive/2010/ ...

  3. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  4. UVA 10306 e-Coins(全然背包: 二维限制条件)

    UVA 10306 e-Coins(全然背包: 二维限制条件) http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Item ...

  5. HDU1248 寒冰王座 【数学题】or【全然背包】

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. 杭电 1248 寒冰王座(全然背包)

    http://acm.hdu.edu.cn/showproblem.php? pid=1248 寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  7. java实现动态规划算法解决存钱罐问题(piggy bank)

    一.实验目的 练习使用动态规划算法解决实际问题(使用Java语言实现) 二.实验内容 [问题描述] 给定一个空存钱罐的重量和这个存钱罐最多能装进去的重量,现在需要在不打破这个存钱罐的情况下猜测里面最少 ...

  8. CODEVS 3269 混合背包

    一道裸的混合背包题目.可是忘记了去重一直TLE,就是假设体积<=全然背包的01.和多重背包都要被全然背包代替,由于他的数量没限制所以用起来更方便. 题目连接:http://codevs.cn/p ...

  9. hdu2844 amp; poj1742 Coin ---多重背包--两种方法

    意甲冠军:你有N种硬币,每个价格值A[i],每个号码C[i],要求. 在不超过M如果是,我们用这些硬币,有多少种付款的情况下,.那是,:1,2,3,4,5,....,M这么多的情况下,,你可以用你的硬 ...

最新文章

  1. Windows批处理中的等待技巧
  2. 虚拟机在Hyper-V和Citrix Xenserver上的区别
  3. 开源短地址_如何在短短5分钟内完成您的第一个开源贡献
  4. C++学习之路 | PTA乙级—— 1038 统计同成绩学生 (20 分)(精简)
  5. 带你探索CPU调度的奥秘
  6. Mysql高可用设计入门
  7. 定向士官学计算机网络技术可以吗,山东信息职业技术学院2016年定向培养士官招生问答...
  8. 【ps-course】layer 图层
  9. 利用百度智能云-文字识别 auto.js
  10. 保证线程安全的四种方法
  11. 查询收尾、带子查询的数据更新、视图 4.12数据库课程实验
  12. SQL SERVER 使用stuff函数进行分组且合并
  13. Mysql优化之6年工作经验总结
  14. 天然肠衣数学建模matlab代码,数学建模天然肠衣搭配问题.doc
  15. 【新手向】emacs配置文件
  16. 计算机系统设计原理pdf百度云,计算机操作系统教程--核心与设计原理习题1答案.pdf...
  17. 淘沙时代靠谱吗-淘宝私域流量指什么?怎么获得?
  18. VMware ESXi安装window10方法
  19. 藏地传奇真言专题简单小结
  20. OpenStack该不该“隐形”?

热门文章

  1. 第二章 知识图谱——机器大脑中的知识库
  2. [caffe] 数据制作和训练
  3. [UOJ422]小Z的礼物
  4. 数据可视化,需要遵循的几条核心原则
  5. 医疗AI技术火热,但其商业模式的落脚点究竟在哪
  6. mac安装python3
  7. Linux高级文本处理之gawk语法和基础命令(一)
  8. iOS开发之简单画板实现
  9. SVN工具的使用 和在Eclipse中安装GPD插件:(多步审批流,因此选择使用工作流(JBPM)来实现)...
  10. android中使用DisplayMetrics获取屏幕参数