动态规划中的0-1背包模型

来源:互联网 发布:金融it 编辑:程序博客网 时间:2024/06/05 03:58
看完题后能否形成一个清晰思路的关键就在于能否根据题意的描述构建出一个恰当的模型,适合这道题目本身同时又能联系自己之前头脑库中的模型。而对于01背包这类模型来说,形成的关键思维就在想最后一个n即用一种抽象的语言把最终的结果给描述出来

  01背包的例子就不举了,这里先给出一个简单的01背包变形的例子:

  

  按照之前的逻辑,我们用抽象的语言描述这道题的结果就是:给定一个长度为n的数列,问从这n个数中获取某些的数的和,使这个和最大同时又不超过某个值k,问能取几个或者这个和是多少。话说到这里,就很容易和0-1背包一一对应起来了,这个k就是0-1中的最大背包容量,某些数的最大和就是0-1背包中所有物品的最大价值。不过0-1背包中的value和weight两个量在这道题目中缩成了num这一个变量。

  下面给出两个例题,都是这样的思路。


饭卡

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18818    Accepted Submission(s): 6584


Problem Description
电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额。如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。所以大家都希望尽量使卡上的余额最少。
某天,食堂中有n种菜出售,每种菜可购买一次。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。
 

 

Input
多组数据。对于每组数据:
第一行为正整数n,表示菜的数量。n<=1000。
第二行包括n个正整数,表示每种菜的价格。价格不超过50。
第三行包括一个正整数m,表示卡上的余额。m<=1000。

n=0表示数据结束。
 

 

Output
对于每组输入,输出一行,包含一个整数,表示卡上可能的最小余额。
 

 

Sample Input
1505101 2 3 2 1 1 2 3 2 1500
 

 

Sample Output
-4532

最大报销额

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20742    Accepted Submission(s): 6199


Problem Description
现有一笔经费可以报销一定额度的发票。允许报销的发票类型包括买图书(A类)、文具(B类)、差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单项物品的价值不得超过600元。现请你编写程序,在给出的一堆发票中找出可以报销的、不超过给定额度的最大报销额。
 

Input
测试输入包含若干测试用例。每个测试用例的第1行包含两个正数 Q 和 N,其中 Q 是给定的报销额度,N(<=30)是发票张数。随后是 N 行输入,每行的格式为:
m Type_1:price_1 Type_2:price_2 ... Type_m:price_m
其中正整数 m 是这张发票上所开物品的件数,Type_i 和 price_i 是第 i 项物品的种类和价值。物品种类用一个大写英文字母表示。当N为0时,全部输入结束,相应的结果不要输出。
 

Output
对每个测试用例输出1行,即可以报销的最大数额,精确到小数点后2位。
 

Sample Input
200.00 32 A:23.50 B:100.001 C:650.003 A:59.99 A:120.00 X:10.001200.00 22 B:600.00 A:400.001 C:200.501200.50 32 B:600.00 A:400.001 C:200.501 A:100.00100.00 0
 

Sample Output
123.501000.001200.50

 

0 0
原创粉丝点击