您的位置:首页 > 其它

POJ 3624 0-1背包问题 动态规划

2010-11-30 23:57 375 查看
第一道背包问题,0-1背包,参考网上一位大牛写的做的。状态方程:dp[i][w] = max{dp[i-1][w], dp[i-1][w-obj[i].wei] + obj[i].val]},但这样会超内存,需要一个空间复杂度的优化将dp改为一维,这招看来以后得常用,具体见转载的《背包九讲》。

明天好好读读《背包九讲》,在多做几道dp变形题,练习在于精不在多。

#include <iostream>
using namespace std;
const int mMax = 3500;//待选物品个数
const int nMax = 14000;//最大容量
struct{
	int wei,val;
}node[mMax];
int main(){
	int n,m,i,w,dp[nMax];
	cin>>n>>m;//n为物品个数,m为最大容量
	for (i = 1;i <= n;i++)
		cin>>node[i].wei>>node[i].val;
		memset(dp,0,(m+1) * sizeof(int));
		for (i = 1;i <= n;i++)
			for (w = m;w >= node[i].wei;w--)//从后向前dp,前面的数会影响后面的
				if (dp[w] < dp[w - node[i].wei] + node[i].val)
					dp[w] = dp[w - node[i].wei] + node[i].val;
		cout << dp[m]<<endl;
		return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: