多维多重背包问题_多重背包问题的两种O(M*N)解法

多重背包的题目很多,最著名的是poj1742楼教主的男人八题之一。

poj1742:coins

有几种面值的钱币和每种的数量,问能够组成m以内的多少种钱数

这个题大家都归为多重背包问题,不过跟实际意义上的背包还是有所差别的

因为如果把钱币看作背包中的物品,那么这个物品的价值和重量是相等的。

也就是没有“性价比"的。。

一种比较快速简单的做法是:

在判断能否放满某个体积时,如果能放满,尽量少用当前物品,贪心一下,对当前物品最优即可。

也可以用dp的思路想,就是dp[i][j]保存 j 体积最少用多少个物品 i

状态转移很明显:如果 dp[i-1][j] 合法 那么显然 dp[i][j]=0,否则在判断dp[i][j]能否由dp[i][j-w[i]]+1得到

复杂度O(N*M),而且常数也很小,可以通过楼教主的题目

两种代码如下:

#include #include#include#include#include#include

using namespacestd;int num[100010];bool dp[100010];int a[110];int c[1010];intn,m;intmain()

{

freopen("in.txt","r",stdin);//int T,cas=0;//scanf("%d",&T);//while(T-

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值