01背包问题

8 篇文章 1 订阅

问题描述:给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,且要能够装到背包中。


通过以下例子来解释01背包问题 

分析:在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义f(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值. 

如果  前一个物品的重量大于当前背包重量,则取不下,如果前一个物品重量小于当前背包重量,则要选择是否取走该物品 ,若取走,则 为f[i-1],[j-w[i]]+v[i],(v[i]为上一个物品的价值),若不取走,则为f[i-1][j]。直到i,j为0为止。

完整代码:

#include<stdio.h>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int f[5][9] = { 0 };
int w[5] = {0,2,3,4,5};//物品重量
int v[5] = {0,3,4,5,8};//物品价值
int main() {
	int 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 (int j = 0; j < 9; j++)
		{
			printf("f[%d][%d]=%d\n", i, j, f[i][j]);
		}
	}
}

 注:参考动态规划DP0-1背包_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值