题目: 公司发了某商务券1000元,限定只能购买商店中的m种商品。每种商品的价格为m1,m2……,要求程序列出所有正好能消费完该购物券的不同方法:
程序输入:
第一行是一个整数m,代表可购买商品的种类数。
接下来是m个整数,每个一行,分别代表了m件商品的单价。
程序输出:
第一行是一个整数,表示共有多少种方案,
第二行开始,每种方案占一行,表示对每种商品购买的数量,中间用空格隔开。
例如:
输入:
2
200
300
则应输出:
2
5 0
3 2
输入:
2
500 800
则应输出:
1
2 0
输入的第一行为物品个数,之后的每行分别为物品的重量。
输出的第一行为可行方案的总数,之后每行分别为对应的方案。
分析:
此题为类背包问题,可用递归求解,题目也可解释为有1个可以承载1000重量的背包,先在有n个物品,每个物品的重量分别为a【1】,
a【2】,……a【i】……a【n】,要求程序列出所有正好能装满该背包的不同方法:
思路为:
设物品的重量分别为a【0】,a【1】,……a【i】,……a【n】,此时假设,我们已经在背包中放入了a【i-1】之前的任意个物品,此事的背包剩余可放入的重量为currweight,此时要做的是就是在a【i】到a【n】选取物品,使得这些物品的重量恰好为currweight,那么现在从a【i】开始考虑,如果a【i】被放入了此背包中,那么背包的剩余重量为currweight — a【i】,如果currweight — a【i】小于0,就否定这种方案,如果大于0,因为物品可以重复放入背包,所以继续考虑a[i]到a[n]放入重量为currweight — a【i】背包的方案,如果
a【i】 没有被放入此背包中,那么直接考虑a【i+1】到a【n】中选取物品,使得这些物品的总重量为currweight。
为了简化代码,下面的代码并没有输出第一行的个数,其实要输出也不难,希望大家可以自己考虑考虑如何在第一行输出可行方案的个数。
代码如下: