2009 英特尔® 线程挑战赛 第五题 背包问题!
背包问题
在你为旅行准备行李时,重要的是你要注意不要在行李箱里放过多的东西,否则你可能会为因行李过重而付出额外的代价。这可能是来自航空公司的额外行李费用,或由于携带背包引起的肌肉酸痛。而且,当你装包时,控制总重量并不是你的唯一标准,你需要为你的旅行放入更有价值的物品。比如当你到澳大利亚度假时,如果你在包里塞满了羽毛,这不会有任何意义。背包问题的目的是要找到物品的最优选择,从而使这些物品的总价值最大,同时使总重量控制在限制范围内。
问题:写一个线程代码来找到能够形成最大总价值的物品清单,同时这些物品的总重量能够满足一个背包(容器)的限定容量。每个物品将有一个相关属性,包括容量(用重量表示)和价值(价格)。背包容量和要使用的物品清单会包含在命令行指定的输入文件内。装入的物品清单,装入的物品数量,总重量以及最终总价值将打印到一个输出文件:packinglist.out。
输入格式:第一行的文本文件将包含三个数:一个实数和两个整数。实数表示背包的容量,第一个整数表示每个可用物品的最大数目,这就是说,即使每个物品会在文件中列出一次,可能会有多个相同物品用来装包。第二个整数表示文件中物品的数目。随后的每一行由三项数据组成:表示物品名的唯一的13个字符长的字符串;表示物品重量的一个实数;以及表示物品价值的一个实数。在输入中不存在重量和价值相同的两个物品。
输出格式:使用易懂的一些格式。列出装入包中的每个物品以及这些物品的数量。同时需要包括所有装入包中物品的总重量和总价值。
第一个输入文件样例:
15.0 4 5
XXL blue Ox 2.0 2.00
gray mouse 1.0 2.00
big green box 12.0 4.00
yellow daisy 4.0 10.00
salmon mousse 1.0 1.00
第一个输出文件样例:
The items to fit into the 15.0 knapsack are:
3 yellow daisy
3 gray mouse
Total capacity used: 15.00
Total value: 36.00
--------------------------------------------------------------------------------
第二个输入文件样例:
15.0 1 6
XXL blue Ox 2.0 2.00
gray mouse 1.0 2.00
big green box 12.0 4.00
yellow daisy 4.0 10.00
salmon mousse 1.0 1.00
9780596521530 1.54 44.99
第二个输出文件样例:
The items to fit into the 15.0 knapsack are:
1 gray mouse
1 9780596521530
1 yellow daisy
1 salmon mousse
1 XXL blue Ox
Total capacity used: 9.54
Total value: 59.99
计时:总执行时间将用于计分。如果没有找到最优方案,将会减分。