『多重背包的可达性问题』Coins&划分大理石

问题描述:coins

Silverland的人们使用硬币。他们有价值A1,A2,A3的硬币…一个Silverland美元。有一天Tony打开他的钱箱,发现有一些硬币。他决定在附近的商店买一块非常漂亮的手表。。 他想支付确切的价格(没有变化),他知道价格不会超过m。但他不知道手表的确切价格。

你要编写一个程序,读取n,m,A1,A2,A3 … An和C1,C2,C3 … Cn对应于值为A1,A2,A3 …的Tony的硬币数量 计算托尼可以支付使用这些硬币的价格(1到m)。

题解

我们设 f [ j ] f[j] f[j]表示体积为 j j j是否能拼出。

完全背包的可达性问题其实可以转化为一个贪心问题:

  • 加入对于每一个物品 i i i来说,假设已经知道了前 i − 1 i-1 i1件物品组合出的答案。由于有物品数的限制,我们可以尽量让少的物品组成更多的数,避免无效的浪费。
  • 例如:放 f [ j ] = 1 f[j]=1 f[j]=1时已经组成,就不用浪费这个次数了;否则当 f [ j − a [ i ] ] = 0 f[j-a[i]]=0 f[ja[i]]=0 f [ j ] = 1 f[j]=1 f[j]=1时才选用这个物品。正好对应了上述思想。
  • 至于具体的操作,我们用一个数组 u s e [ j ] use[j] use[j]表示拼成体积为j时最少需要多少物品 i i i,和 f f
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值