Problema de carga del barco (método de retroceso)

 

Problema de carga: método de retroceso (árbol de subconjuntos) 

Problema: Hay 2 barcos, la capacidad de carga es: c1 y c2, hay n mercancías, el peso es v [i], i = (1: n) y ∑v [i] <= c1 + c2, encuentre dos ¿La viga de carga más grande del barco?

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

 

Supongo que te gusta

Origin blog.csdn.net/weixin_40823740/article/details/109641396
Recomendado
Clasificación