背包问题

一、 01背包

  1. 01背包含义很简单,就是放进包里和不放进包里的区别。

  2. 状态转移方程:
    (1) 一维:f[v] = max(f[v-c[i]] + w[i], f[v]);
    (2) 二维:f[v][n] = max(f[v-c[i]][n-1] + w[i], f[v][n-1]);

  3. 取值:
    (1)v代表背包容量,n代表能放下的物品个数。(输入,取值任意数)
    (2)c[i]代表第i个骨头的大小。(输入,取值任意数)
    (3)w[i]代表第i个骨头的价值。(输入,取值任意数)
    (4)i代表1-n个骨头(循环范围1-n)
    (5)j代表第j个骨头占空(循环范围c[i]-v)

二、 完全背包

  1. 状态转移方程:
    (1) 一维:f[v] = max(f[v-c[i]] + w[i], f[v]);
    (2) 二维:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]);

  2. 取值:
    (1)v代表背包容量,n代表能放下的物品个数。(输入,取值任意数)
    (2)c[i]代表第i个骨头的大小。(输入,取值任意数)
    (3)w[i]代表第i个骨头的价值。(输入,取值任意数)
    (4)i代表1-n种骨头(循环范围1-n)
    (5)j代表第j种的一个骨头占空(循环范围c[i]-v)

三、 多重背包

  1. 在01背包基础上延伸出来。

  2. 状态转移方程:
    (1)一维:f[v] = max(f[v-k*c[i]] + k*w[i], f[v]);
    (2) 二维:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]);

  3. 取值:
    (1)v代表背包容量,n代表能放下的物品个数。(输入,取值任意数)
    (2)c[i]代表第i个骨头的大小。(输入,取值任意数)
    (3)w[i]代表第i个骨头的价值。(输入,取值任意数)
    (4)p[i]代表每一种骨头有多少个。
    (5)i代表1-n个骨头(循环范围1-n)
    (6)j代表第j种骨头(循环范围c[i]-v)
    (7)k代表第j种骨头中的1-k个(循环范围1-p[i]和v-k*c[i] >= 0)
    (8)注意:第三个循环条件两个,1-p[i]和j-k*c[i] >= 0;

四、 混合背包

  1. 一个大for包括if判断多重背包还是完全背包。

  2. 状态转移方程:
    (1)一维:
    完全背包:f[v] = max(f[v-c[i]] + w[i], f[v]);
    多重背包:f[v] = max(f[v-kc[i]] + kw[i], f[v]);
    (2)二维:
    完全背包:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]);
    多重背包:f[v][n] = max(f[v-c[i]][n] + w[i], f[v][n-1]);

  3. 取值:
    见完全背包以及多重背包的取值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值