第二届国信蓝点杯 c语言 本科组 赛题分析 第9题

题目: 公司发了某商务券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。

为了简化代码,下面的代码并没有输出第一行的个数,其实要输出也不难,希望大家可以自己考虑考虑如何在第一行输出可行方案的个数。

代码如下:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值