动态规划-01背包问题

这两天,做了太多的动态规划的题,结果都不会,所以决定用一周来看看,发现并用不了一周,两天就可以。先总结01背包的问题

问题,输入物品的个数,然后输入每个物品的重量,在输入每个物品的价值,最后输入背包可以容纳的总重量,求最大的组合方式。

代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;


int D_p(int *weight,int *value,int num,int maxweight)
{
	if(weight == NULL || value == NULL || num <= 0 || maxweight <= 0)
		return -1;
	int **end = new int*[num+1];
	for(int i = 0; i <= num; ++i)
	{
		end[i] = new int[maxweight+1];
	}
	memset(*end,0,(num+1)*sizeof(int));
	for(int i = 1; i <= num; ++i)
	{
		end[i][0] = 0;
		for(int j = 1; j <= maxweight; ++j)
		{
			if(j < weight[i-1])
				end[i][j] = end[i-1][j];
			else
			{
				int tmp = end[i-1][j - weight[i-1]] + value[i-1];
				if(tmp < end[i-1][j])
					end[i][j] = end[i-1][j];
				else
					end[i][j] = tmp;
			}
		}
	}
	return end[num][maxweight];
}
void main()
{
	int num,maxweight;
	cin>>num;
	int *weight = new int[num+1];
	int *value = new int[num+1];
	if(weight == NULL || value == NULL)
		exit(1);
	int tmp;
	for(int i = 0; i < num; ++i)
	{
		cin>>tmp;
		weight[i] = tmp;
	}
	for(int i = 0; i < num; ++i)
	{
		cin>>tmp;
		value[i] = tmp;
	}
	cin>>maxweight;
	cout<<D_p(weight,value,num,maxweight)<<endl;
}
总结一下,大概思想,就是用二维数组存放已经存在的计算结果,然后每次取值查看,提高效率。



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值