2 3 4 5 6 7 8 9 10 11 12

0-1背包问题(动态规划)

一、实验内容
运用动态规划算法解决矩阵连乘问题(或流水作业调度、或背包问题)
使用动态规划算法解决0-1背包问题。

二、所用算法基本思想及复杂度分析
1.算法基本思想
动态规划基本思想是一种在数学、计算机科学和经济学中经常使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,但是经分解得到的子问题往往不是互相独立的,不同子问题的数目常常只有多项式量级。

2.问题分析及算法设计
问题分析:
(1) 有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和。
(2) 根据动态规划解题的步骤(首先进行问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问题的递推关系式、填表、寻找解组成)。
(3) 建立模型,即求max(V1X1+V2X2+…+VnXn)。
(4) 寻找约束条件,W1X1+W2X2+…+WnXn<capacity。
(5) 得到递推关系式,然后填表。
(6) 找出0-1背包问题的最优解以及解组成,然后编写代码实现。

算法设计:
(1) 通过填写表把所有已经解决的子问题答案纪录下来,在新问题里需要用到的子问题可以直接提取,避免了重复计算,从而节约了时间,所以在问题满足最优性原理之后,用动态规划解决问题的核心就在于填表,表填写完毕,最优解也就找到。
(2) 特例:

  1. 算法复杂度分析
    01背包问题属于NP问题之一,每个物品有选和不选两种策略,若采用暴力搜索算法,其时间复杂度为O(2n),而采用动态规划的方式,则可以将时间复杂度从O(2n)降到O(n^2),通过自底向上逐层递推可以求得最优解。

三、源程序核心代码及注释(截图)

四、运行结果

五、调试和运行程序过程中产生的问题及解决方法,实验总结(5行以上)
刚刚学习动态规划时调试运行,感觉数据变换的顺序太复杂,然后去百度,看各优秀博主的讲解和特例,然后再结合自己的代码,简单的画了草图,然后跟据自己所画的草图,结合表中的数据来一个一个的调试,这使得调试的过程变得简单易懂。这次动态规划的实验,让我对动态规划有了初步的认识,也明白了最优化原理是动态规划的基础,它主要是不论前面决策如何,都对后各阶段的决策序列必须构成最优策略。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

const int N = 401;
const int M = 1501;

int V[N][M];


int max(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}

int dpKnapSack(int n, int c, int w[], int v[])
{
	int i, j;

	for (j = 0; j <= c; j++)
	{
		V[0][j] = 0;//当没装物品时,价值统一为0
	}
	for (i = 1; i <= n; i++)//物体编号
	{
		for (j = 1; j <= c; j++)//背包容量
		{
			if (j < w[i])//没装第i件物品
				V[i][j] = V[i - 1][j];
			else//装第i件物品
				V[i][j] = max(V[i - 1][j], V[i - 1][j - w[i]] + v[i]);
		}
	}

	return V[n][c];
}

int main()
{
	int w[N], v[N];
	int n, c, i;

	while (scanf("%d%d", &n, &c) != EOF) {
		for (i = 1; i <= n; i++)
		{
			cin >> w[i];
		}
		for (i = 1; i <= n; i++)
		{
			cin >> v[i];
		}
		cout << dpKnapSack(n, c, w, v) << endl;
	}
	return 0;
}
posted @   MrDevil  阅读(3171)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示