动态规划学习笔记<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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值