写了一个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() {
}