01背包问题-我犯的错误记录

写了一个01背包,本来打算节省存储空间的. 结果发现方向错了. 这道题和LCS不同,LCS既可以按列进行计算,又可以按行计算.每一列(行)仅用到前一列(行)的结果.

 背包不同.

先说明: 一列共有num个元素. num代表的是物品的种类数.  (原本在为优化情况下) .一行共有totalweight个元素. tatalweight代表背包乘重量

在01背包问题中,只能按照一行一行进行计算. 因为每一列有可能用到其前面若干列的结果.

 我的错误代码如下:

/**
 * 0-1背包 问题 升级版
 * 优化了存储空间的使用:按列进行计算
 */

#include<iostream>
#include<stdio.h>

using namespace std;
const int M = 1000;
//const int N = 1002;

class Knapsack {
	public:
		Knapsack(int weight[], int value[], int tw, int num);
		void StartCompute();
		void ShowResult();
		~Knapsack();
	protected:
		int *weight, *value;
		int num, tw; //物品种类 背包承重量
		int totalvalue;

		int calc[2][M];
};


int main() {
	//Get the input
	//Input format:
	//First line : TotalWeight  numbers of item
	//The follow lines: (weight ,value)
	freopen("input_01Knapsack.txt", "r", stdin);
	freopen("output_01Knapsack.txt", "w", stdout);
	int casenum;
	cin>>casenum; 
	int tw, num;
	for(int i = 0; i < casenum; i++) {
		cin>>tw>>num;
		int *value  = new int[num];
		int *weight = new int[num];
		for(int i = 0 ; i < num; i++) cin>>weight[i]>>value[i];
		Knapsack a(weight, value, tw, num);
		a.StartCompute();
		a.ShowResult();
		delete[] value;
		delete[] weight;
	}

}






Knapsack::Knapsack(int weight[], int value[], int tw, int num) {
	this->weight = weight;
	this->value = value;
	this->tw = tw;
	this->num = num;
	for(int i = 0; i < num; i++) 
		calc[0][i] = calc[1][i] = 0;
}


void Knapsack::StartCompute() {
	int *prev = calc[0];
	int *next = calc[1];

	for(int y = 1; y < tw; y++){
		for(int i = 0; i < num; i++) {
			if(weight[i] <= y && (prev[y] <= prev[y - weight[i]] + value[i])) {
				next[y] = prev[y - weight[i]] + value[i];
			}
			else next[y] = prev[y];			
		}

		//Swap prev and next
		int *temp = prev;
		prev = next;
		next = temp;

	}
	totalvalue = prev[num - 1];
}

void Knapsack::ShowResult() {
	cout<<"The biggest value: "<<totalvalue<<endl;
}

Knapsack::~Knapsack() {
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值