动态规划学习笔记<3>

某工厂预计明年有A、B、C、D四个新建项目,每个项目的投资额Wk及其投资后的收益Vk如下表所示,投资总额为30万元,如何选择项目才能使总收益最大?

Project

Wk

Vk

A

15

12

B

10

8

C

12

9

D

8

5

声明一个 二维数组

m[ i ][ j ] 表示 在面对第 i 件物品,且背包容量为 j 时所能获得的最大价值

j < w[i]

这时候背包容量不足以放下第 i 件物品,只能选择不拿
m[ i ][ j ] = m[ i-1 ][ j ]

j>=w[i]

这时背包容量可以放下第 i 件物品,我们就要考虑拿这件物品是否能获取更大的价值。

如果拿取

m[ i ][ j ]=m[ i-1 ][ j-w[ i ] ] + v[ i ]
这里的m[ i-1 ][ j-w[ i ] ]指的就是考虑了i-1件物品,背包容量为j-w[i]时的最大价值,也是相当于为第i件物品腾出了w[i]的空间。

如果不拿

m[ i ][ j ] = m[ i-1 ][ j ]

	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= c; j++){
			if (j >= w[i])
				m[i][j] = max(m[i - 1][j], m[i - 1][j - w[i]] + v[i]);
			else
				m[i][j] = m[i - 1][j];
		}
	}

完整代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
	int v[7] = { 0,8,10,6,3,7,2 };
	int w[7] = { 0,4,6,2,2,5,1 };

	int m[100][100];
	int n = 6, c = 12;
	memset(m, 0, sizeof(m));
	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= c; j++){
			if (j >= w[i])
				m[i][j] = max(m[i - 1][j], m[i - 1][j - w[i]] + v[i]);
			else
				m[i][j] = m[i - 1][j];
		}
	}

	for (int i = 1; i <= n; i++){
		for (int j = 1; j <= c; j++)
			cout << m[i][j] << ' ';
		cout << endl;
	}
		
	return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划(Dynamic Programming)是一种数学方法,用于求解决策过程最优化问题。它没有一个统一的标准模型或通用方法,而是需要根据具体问题进行具体分析和构造模型。对于较复杂的问题,在选择状态、决策和确定状态转移规律等方面需要丰富的想象力和灵活的技巧性,因此在应用上存在一定的局限性。 至于动态规划在MATLAB中的速度规划方面,由于动态规划的特点是能够得到全局最优解,对于约束条件复杂的问题,动态规划方法将整个过程化为一系列结构相似的子问题,每个子问题的变量个数减少,约束集合简单得多。特别是对于约束集合、状态转移和指标函数不能用分析形式给出的优化问题,可以对每个子过程用枚举法求解,而约束条件越多,决策的搜索范围越小,求解也越容易。因此,动态规划在求解动态规划速度规划问题时可能是一种较为合适的方法,并且通常是求全局最优解的唯一方法。 综上所述,动态规划是一种数学方法,用于求解决策过程最优化问题。在MATLAB中,动态规划可以用于速度规划问题,通过将问题分解为一系列子问题并枚举求解,可以得到全局最优解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [学习笔记-Matlab算法篇-动态规划](https://blog.csdn.net/seek97/article/details/108346520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值