#include <iostream>
#include<fstream>
#include<stdio.h>
using namespace std;
template<class Type>
class Loading
{
//friend Type MaxLoading(Type[],Type,int);
//private:
public:
void Backtrack(int i);
int n,*x,*bestx;
Type *w,c,cw,bestw,r;
};
template<class Type>
Type MaxLoading(Type w[],Type c,int n,int bestx[])
{
Loading<Type> X;
X.x = new int[n+1];
X.w = w;
X.c = c;
X.n = n;
X.bestx = bestx;
X.bestw = 0;
X.cw = 0;
X.r = 0;
for(int i = 1;i <= n;i ++)
{
X.r += w[i];
}
X.Backtrack(1);
return *X.bestx;
}
template<class Type>
void Loading<Type>::Backtrack(int i)
{
if(i>n)
{
if(cw > bestw)
{
for(int j = 1;j <= n; j++)
{
bestx[j] = x[j];
bestw = cw;
}
}
return;
}
r -= w[i];
if(cw + w[i] <= c)
{
x[i] = 1;
cw += w[i];
Backtrack(i + 1);
cw -= w[i];
}
if(cw + r > bestw)
{
x[i] = 0;
Backtrack(i + 1);
}
r += w[i];
}
int main()
{
int n,c;
int *bestx = new int[n+1];
ifstream in("input.txt");
ofstream out("output.txt");
in>>n;
in>>c;
int *w = new int[n+1];
for(int i = 1;i <= n;i ++)
{
in>>w[i];
}
MaxLoading(w,c,n,bestx);
for(int j=1;j <= n;j ++)
{
out<<bestx[j];
out<<" ";
//cout<<bestx[j]<<" ";
}
//cout<<endl;
in.close();
out.close();
return 0;
}
« 问题描述
有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi ,且 ,要求确定是否有一个合理的装载方案可将这n个集装箱装上这2艘轮船。如果有,请给出该方案。
« 编程任务
利用回溯法试设计一个算法求出该装载问题的解。
« 数据输入
由文件input.txt提供输入数据。文件的第1行中有2个正整数n及c,表示有n个集装箱,第一艘船的载重量为c。接下来的一行为每个集装箱的重量。
« 结果输出
程序运行结束时,将计算出的最优解输出到文件output.txt中,如果某集装箱被装入船上,则对应的解为1,如果不能装入则为0。
输入文件示例 | 输出文件示例 |
input.txt | output.txt |
|
|
3 30 16 15 15 | 0 1 1 |