作业原题:
(1)背包问题。对上文中提到的背包问题提供的表1(数据文件下载Knapsack.txt,第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中。
Knapsack.txt文件内容如下:
我的解答如下:
源代码:
#include <iostream>
#include <fstream>
using namespace std;
struct Things
{
int weight;
int value;
};
int max(int a,int b,bool& k)
{
if(a < b)
{
k = true;
return b;
}else
{
k = false;
return a;
}
}
int getTheMostValue(int const W,
int const N,
Things const things[],
char const* outfile)
{
ofstream out(outfile);
if (!out)
{
return -1;
}
int** K;
cout<<"背包容量:"<<W<<"\t"<<"物品总数:"<<N<<endl;
cout<<endl;
K = new int*[W+1];
for (int i = 0; i <= W; ++i)
{
K[i] = new int[N+1];
}
for (int j = 0; j <= N ; ++j)
{
K[0][j] = 0;
}
for (int w = 0; w <= W ; ++w)
{
K[w][0] = 0;
}
//
bool k = false;
int res_weight = 0;//总重量
cout<<"第 ";
for (int j = 1; j <= N; ++j)
{
for (int w = 1; w <= W; ++w)
{
if (things[j].weight > w)
{
K[w][j] = K[w][j-1];
//不放进去
}
else
{
K[w][j] = max(K[w][j-1] , K[w-things[j].weight][j-1]+things[j].value , k);
}
}
if( k )
{
cout<<j<<" ";
res_weight += things[j].weight;
}
}
cout<<"件物品被放进背包里\n";
int res_value= K[W][N];//总价值
cout<<"总重量为:"<<res_weight<<endl;
cout<<"总价值为:"<<res_value<<endl;
cout<<"构造的二维表格请查看文件:"<<outfile<<endl;
for (int w = 0; w <= W; ++w)
{
for (int j = 0; j <= N; ++j)
{
out<<K[w][j]<<"\t";
}
out<<endl;
}
out.close();
for (int i = 0; i < W; ++i)
{
delete [] K[i];
}
delete [] K;
return res_value;
}
int main(int argc, char const *argv[])
{
char const* infile = argv[1];
char const* outfile = argv[2];
ifstream in(infile);
if (!in)
{
return -1;
}
int W,N;
Things* things;
in>>W>>N;
things = new Things[N+1];
for (int i = 1; i <= N; ++i)
{
in>>things[i].weight>>things[i].value;
}
in.close();
int result = getTheMostValue(W, N, things, outfile);
if(-1 == result)
return -1;
return 0;
}
结果如下:
KnapsackResult.txt文件的内容如下: