载重问题:回溯法(子集树)
题目:有2辆轮船,承载量分别是:c1和c2,有n个货物,重量为v[i],i=(1:n),且∑v[i]<=c1+c2,求两条船最大的承重梁?
#include<iostream>
#include<vector>
using namespace std;
int bestw,n,rw;
void backtrack(vector<int>& v, int c1,int cw,int t)
{
if (t > n)
{
if (bestw < cw)
bestw = cw;
return;
}
if (cw + v[t] <= c1)
{
cw += v[t];
backtrack(v, c1, cw, t + 1);
cw -= v[t];
}
backtrack(v, c1, cw, t+1);
}
void backtrace(vector<int>& v, int c1, int cw, int rw,int t)
{
if (t > n)
{
if (cw > bestw)
bestw = cw;
return;
}
rw -= v[t];
if (cw + v[t] < c1)
{
cw += v[t];
backtrace(v, c1, cw, rw, t + 1);
cw -= v[t];
}
if (cw + rw > bestw)
backtrace(v, c1, cw, rw, t + 1);
rw += v[t];
}
int main()
{
int nums,c1;
while (cin >> n)
{
vector<int>v;
rw = 0;
for (int i = 0; i <= n; i++)
{
if (!i)
v.push_back(0);
else
{
cin >> nums;
v.push_back(nums);
rw += nums;
}
}
bestw = 0;
int cw = 0;
cin >> c1;
//backtrack(v, c1, cw, 1);
backtrace(v, c1, cw, rw, 1);
cout << bestw << endl;
}
return 0;
}
/*
3
20 40 40
50
*/