01背包问题(极其详细)

关于01背包问题,主要是学会状态转移方程(!)

状态转移方程:f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);

i是四件物品 j表示当前背包容量,f[n][m] [n]可以偷的物品数量 [m]偷的物品重量

基本思路: 一件物品有两种选择 : 1.选择取这件物品,背包容量j-w[i] 但是会获得该物品的价值v[i]

2.选择不去取这件物品 则 i-1 可以偷的物品数量就少了1个

#include<iostream>

#include<algorithm>

using namespace std;

int f[5][9] = { 0 }; //[n]可以偷的物品数量 [m]偷的物品重量

int w[5] = { 0,2,3,4,5 }; //重量

int v[5] = { 0,3,4,5,8 }; //价值

int main() {

int i, j;// i是四件物品 j表示当前背包容量

memset(f, 0, sizeof(f));

for (int i = 1; i < 5; i++) {

for (int j = 1; j < 9; j++) {

if (w[i] > j) //如果当前背包容量小于当前物品容量

f[i][j] = f[i - 1][j]; //选择不去取这件物品

else f[i][j] = max(f[i - 1][j], f[i - 1][j - w[i]] + v[i]);

}

for (int i = 0; i < 5; i++)

for (j = 0; j < 9; j++)

printf("f[%d][%d]=%d\n", i, j, f[i][j]); //

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值