Ship load problem (backtracking method)

 

Loading problem: backtracking method (subset tree) 

Problem: There are 2 ships, the carrying capacity is: c1 and c2, there are n goods, the weight is v[i], i=(1:n), and ∑v[i]<=c1+c2, find two The biggest load-bearing beam of the ship?

#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
*/

 

Guess you like

Origin blog.csdn.net/weixin_40823740/article/details/109641396