船の負荷の問題(バックトラッキング方法)

 

読み込みの問題:バックトラッキング方法(サブセットツリー) 

問題:2隻の船があり、環境収容力はc1とc2、n個の商品があり、重量はv [i]、i =(1:n)、および∑v [i] <= c1 + c2です。 2船の最大の耐荷重ビーム?

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

 

おすすめ

転載: blog.csdn.net/weixin_40823740/article/details/109641396