Piggy-Bank - 九度教程第 102 题

题目

时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述:
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!
输入:
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, P and W (1 <= P <= 50000, 1 <= W <=10000). P is the value of the coin in monetary units, W is it’s weight in grams.
输出:
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.”.
样例输入:
3
10 110
2
1 1
30 50
10 110
2
1 1
50 30
1 6
2
10 3
20 4
样例输出:
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[j]dp[j-list[i].w]+list[i].v 中选择较小的转移值;
其次,该问题要求钱币和空储蓄罐的重量恰好达到总重量,即在背包问题中表现为背包恰好装满。
在前文中已经讨论了 0-1 背包的此类变化,只需变化 dp[j]的初始值即可。

#include <stdio.h>
#define INF 0x7fffffffint min(int a,int b){return a<b ? a : b;
}struct E{//代表钱币结构体
int w;
int v;
}list[501];int dp[10001];//状态int main()
{int T;scanf("%d",&T);//输入测试数据组数while(T--){//T次循环,处理T组数据int s,tmp;scanf("%d%d",&tmp,&s);//输入空储蓄罐数量和装满钱币的储蓄罐重量s-=tmp;//计算钱币所占重量int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d",&list[i].v,&list[i].w);}for(int i=0;i<=s;i++){dp[i]=INF;}dp[0]=0;//因为要求所有物品恰好装满,所以初始时除dp[0]外//其余dp[i]均为无穷(或者不存在)for(int i=1;i<=n;i++){//遍历所有物品for(int j=list[i].w;j<=s;j++){//完全背包,顺序遍历所有可能转移的状态if(dp[j-list[i].w]!=INF){//若dp[j-list[i].w]不为无穷,就可以由此状态转移而来dp[j]=min(dp[j],dp[j-list[i].w]+list[i].v);//取转移值和原值的较小值}}}if(dp[s]!=INF){//若存在一种方案使背包恰好装满,输出其最小值printf("The mininum amount of money in the piggy-bank is %d.\n",dp[s]);}else{puts("This is impossible.");}}return 0;
}

总结一下完全背包问题:
其特点为每个物品可选的数量为无穷,其解法与 0-1背包整体保持一致,与其不同的仅为状态更新时的遍历顺序。时间复杂度和空间复杂度均和 0-1 背包保持一致。

最后介绍多重背包问题,其介于 0-1 背包和完全背包之间:有容积为V 的背包,给定一些物品,每种物品包含体积 w、价值 v、和数量 k,求用该背包能装下的最大价值总量。

与之前的背包问题都不同,每种物品可选的数量不再为无穷或者 1,而是介于其中的一个确定的数 k。与之前讨论的问题一样,可以将多重背包问题直接转化到 0-1 背包上去,即每种物品均被视为 k 种不同物品,对所有的物品求 0-1背包,其时间复杂度为:

由此可见,降低每种物品的数量 ki 将会大大降低其复杂度,于是采用一种更为有技巧性的拆分。将原数量为 k 的物品拆分为若干组,每组物品看成一件物品,其价值和重量为该组中所有物品的价值重量总和,每组物品包含的原物品个数分别为:为:1、2、4…k-2^c+1,其中 c 为使 k-2^c+1 大于 0 的最大整数。这种类似于二进制的拆分,不仅将物品数量大大降低,同时通过对这些若干个原物品组合得到新物品的不同组合,可以得到 0 到 k 之间的任意件物品的价值重量和,所以对所有这些新物品做 0-1 背包,即可得到多重背包的解。由于转化后的 0-1 背包物品数量大大降低,其时间复杂度也得到较大优化,为:

Piggy-Bank - 九度教程第 102 题相关推荐

  1. 质因数的个数 - 九度教程第54题

    质因数的个数 - 九度教程第54题 题目 时间限制:1 秒 内存限制:32 兆 特殊判题:否 题目描述: 求正整数 N(N>1)的质因数的个数. 相同的质因数需要重复计算.如 120=22235 ...

  2. 不容易系列之一(九度教程第 94 题)

    不容易系列之一(九度教程第 94 题) 时间限制:1 秒 内存限制:128 兆 特殊判题:否 1.题目描述: 大家常常感慨,要做好一件事情真的不容易,确实,失败比成功容易多了!做好"一件&q ...

  3. Excel排序 九度教程第4题

    题目链接 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始) ...

  4. 数制转换 九度教程第44题 a进制数转换为b进制数 不同进制之间相互转换

    题目链接 解题思路: 1.将a进制数转换成十进制数: 2.将十进制数转换成b进制数: 3.使用do while 循环,可以确保即使被转换数字是 0 ,程序也能正常工作. AC代码: #include& ...

  5. 成绩排序 九度教程c语言,九度OJ 1089 数字反转

    题目分析: 使用队列存放每一位的数字,然后输出并计算得到反转数值,从而实现数字反转. 源代码: [cpp] #include #include using namespace std; int mai ...

  6. 九度oj 第1题 二维数组中的查找 何海涛:《剑指Offer:名企面试官精讲典型编程题》

    一.题目信息 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 输入: ...

  7. 动态规划 背包问题小结 0-1背包(采药 九度第101题) 完全背包(Piggy-Bank POJ 1384) 多重背包(珍惜现在,感恩生活 九度第103题)

    本小结介绍0-1背包.完全背包以及多重背包问题 记忆要点: 0-1背包:二维数组情况下,顺序遍历体积或者倒序均可以                降维情况下需倒序遍历体积 完全背包:数组降维+顺序遍历 ...

  8. 九度题库(所有题目整理,适合计算机考研和面试的人用)

    本来搜一道面试题,找到叫九度题库的地方,发现里面的题目都比较基础,很适合当面试题来练习. 于是,闲得蛋疼,把所有题目给爬下来了,并整理成markdown格式,然后export成pdf,方便大家离线阅读 ...

  9. 【强烈推荐】程序猿们,九度Online Judge开始举办月赛啦!!会编程才是王道!!!!!

    程序猿们,九度Online Judge开始举办月赛啦!!会编程才是王道!! 在国内计算机考研中,已经有越来越多的高校采用ACM上机考试的形式,在复试中来考察考生的实际动手编程能力,并且机试在复试中所占 ...

最新文章

  1. python实现二分查找(折半查找)算法
  2. 被relativeLayout的grivate center 折腾死了
  3. linux blind函数,Linux网络编程入门
  4. toncat 如何部署 java_tomcat中部署java项目
  5. dnn中个性化服务的使用
  6. (转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别
  7. [转]Excel导入异常Cannot get a text value from a numeric cell解决
  8. linux下opencv读取图片并存储到mysql数据库中
  9. zookeeper3.5.x版本启动报错java.io.IOException: No snapshot found, but there are log entries.解决
  10. 普通路由器改4g路由器_4G工业路由器助力叉车锂电池监测
  11. 一步一坑学android之安装andriod studio(andriod studio3.0)
  12. Monad用简单的英语? (对于没有FP背景的OOP程序员)
  13. python透明图片合并_如何使用PIL将透明png图像与另一个图像合并
  14. 苹果邮箱 android设置字体,苹果6邮件怎么设置qq邮箱怎么设置几号字体
  15. windows中bat批处理的注释语句
  16. 计算机网络英语形容词,英语常用形容词有哪些
  17. 注册表 关闭打印机服务器,Windows 2016 server部署打印机服务器后 重启服务器,出现“重定向的打印机”,如何来删除?...
  18. speedoffice文档中如何快速撤回到上一步操作
  19. MII接口详解【转】
  20. 最详细的宝塔青龙面板搭建教程

热门文章

  1. LeetCode题解(1276):不浪费原料的汉堡制作方案(Python)
  2. 用户名不在sudoers文件中此事将被报告的解决方法
  3. 中国人寿财险java_中国人寿财险社会招聘笔试内容: 今天刚笔试完,蹭着记着赶紧写上来,以便大家以后参考;...
  4. 安装Aira2的三种方法(包括一键安装命令,epel源安装,源码安装)
  5. 达梦数据库(DM)——表空间管理命令大全
  6. python自动生成和读取word_使用Python自动生成Word文档的教程
  7. 外贸:掌握这5个社交软件,让你不在为营销推广感到烦恼
  8. 幼师计算机应用基础的认识200字,《计算机应用基础》课程教学与学前教育专业的深度融合...
  9. 真c++ 从二叉树到红黑树(2)之二叉树基类
  10. p 车票提前下车客户端linux,火车能中途下车么?看完你就知道了