5.2 装载问题:
1递归迭代回溯:
#include <iostream>
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#include <string>
#include <math.h>
#define inf 0x3f3f3f3f
#define maxn 200050
using namespace std;
// 5.2 装载问题
int best_w = 0;
int ans[101];
int w[101];
int x[101];
int n;
int c1,c2;
int pre_w;
int r;
// 递归迭代回溯方式
void back_(int index)
{
if(index > n)
{
if(best_w < pre_w)
{
best_w = pre_w;
for(int i=1; i<=n;i++)
{
ans[i] = x[i];
}
}
return ;
}
r -= w[index];
if(pre_w + w[index] <= c1)
{
x[index] = 1;
pre_w += w[index];
back_(index+1);
pre_w -= w[index];
}
if(pre_w + r > best_w)
{
x[index] = 0;
back_(index+1);
}
r += w[index];
}
int main()
{
cin>>n;
r = 0;
cin>>c1>>c2;
for(int i=1; i<=n; i++)
{
cin>>w[i];
r += w[i];
}
memset(ans,0,sizeof(ans));
back_(1);
for(int i=1; i<=n; i++)
{
if(ans[i])
{
cout<<w[i]<<endl;
}
}
}
2非递归迭代回溯:
#include <iostream>
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#include <string>
#include <math.h>
#define inf 0x3f3f3f3f
#define maxn 200050
using namespace std;
// 5.2 装载问题
int best_w = 0;
int ans[101];
int w[101];
int n;
int c1,c2;
int pre_w;
int r;
// 非递归迭代回溯方式
int best_back()
{
int i = 1;
int *x = new int[n+1]; //动态开辟数组空间
while(true)//搜索子树
{
while(i<=n && pre_w + w[i] <= c1) //左子树
{
r -= w[i];
x[i] = 1;
pre_w += w[i];
i++;
}
if(i > n) //叶子节点
{
for(int j=1; j<=n; j++)
{
ans[j] = x[j];
}
best_w = pre_w;
}
else //右子树
{
r -= w[i];
x[i] = 0;
i++;
}
while(pre_w + r <= best_w) //剪枝+回溯
{
i--;
while(x>0 && !x[i])
{
r += w[i];
i--;
}
if( i == 0)
{
delete[] x;
return best_w;
}
x[i] = 0;
pre_w -= w[i];
i++;
}
}
}
int main()
{
cin>>n;
cin>>c1>>c2;
r = 0;
pre_w = 0;
best_w = 0;
for(int i=1; i<=n; i++)
{
cin>>w[i];
r += w[i];
}
cout<<best_back()<<endl;
for(int i=1; i<=n; i++)
{
if(ans[i])
{
cout<<w[i]<<endl;
}
}
return 0;
}
5.3
#include <iostream>
#include <bits/stdc++.h>
#include <queue>
#include <stack>
#include <string>
#include <math.h>
#define inf 0x3f3f3f3f
#define maxn 200050
using namespace std;
// 5.3 批处理作业调度
int f; // 全排列每次完成时间和
int f1; // 机器1处理时间
int f2[101]