01背包问题

本文详细介绍了如何使用动态规划方法解决01背包问题,包括设计思路、动态规划函数实现、以及时间复杂度的分析,并通过实验验证了算法性能。
摘要由CSDN通过智能技术生成

目录

一、目的

二、设计思路

三、流程图

四、动态规划函数

五、时间复杂度分析

七、代码


一、目的

能正确利用动态规划法解决01背包问题,能够写出动态规划函数,分析边界值测试效果,能够正确地分析时间复杂度

二、设计思路

分析问题后,可以得出01背包问题可以看做是决策一个序列,对任意变量x的决策是决定x=1或者是x=0.如果将二维数组V(n,c)表示将n个物品装入容量为c的背包获得的最大价值,则初始子问题就是把前面i个物品装入容量为0的背包和把0个物品装入容量为j的背包。

Int V[]           // 存储最大价值

Int x[]           // 存储装入背包的物品

Int w[]          //存储物品的重量

Int v[]           //存储物品的价值

Int n            //物品的数量

Int c            //背包的容量

三、流程图


四、动态规划函数

当决策x时,问题处于两种状态,一种是背包不足以装入物品,则装入的物品当前价值与之前的物品价值一样,背包不增加价值,一种是背包可以装入物品,如果把当前物品装入背包那么当前价值就是减去这个物品的容量后的最大价值加上这个物品的价值,然后比较二者取较大值,动态规划函数如下:

五、时间复杂度分析

N是物品的数量,C是背包的容量,该算法里面有两个嵌套的for循环,其时间复杂度为O(N*C)还有一个时间复杂度为O(N)的for循环,所以算法的时间复杂度为O(N*C)

、实验步骤和调试过程

1.测试数据设计

N和C的规模

5000

10000

15000

20000

25000

30000

35000

40000

耗时(ms)

192

772

1705

3062

5089

7746

12091

17800

2.测试结果散点图

七、代码
#include<iostream>
#include<stdio.h>
#include<time.h>
using namespace std;
int** V;
int* x;
int bag(int w[], int v[], int n, int c)
{
	int i, j;
	for (i = 0; i <= n; i++)
	for (j = 0; j <= c; j++)
	{
		V[i][j] = 0;
	}
	for (i = 1; i <=n; i++)
	{
		for (j = 1; j <=c; j++)
		{
			if (j < w[i-1])V[i][j] = V[i - 1][j];//不能被装入背包
			else V[i][j] = max(V[i - 1][j], V[i - 1][j-w[i-1]] + v[i-1]);//能被装入背包
		}
	}
	for (i = n,j=c; i > 0; i--)
	{
		if (V[i][j] > V[i - 1][j])
		{
			x[i - 1] = 1;
			j = j - w[i - 1];
		}
		else
			x[i - 1] = 0;
	}
	return V[n][c];
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值