#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX 100
int c1, c2; //两船的载重量
int n; //货物数量
int w[MAX]; //货物重量
int maxw; //最大装载量
bool finished; //已达到装载最大量时,finished为true
void Backtrack(int k, int cw, int upperBound)
{
if (k == n)
{
if (cw > maxw)
{
if ((maxw = cw) == c1)
{
finished = true;
}
}
}
else
{
if (cw + w[k] <= c1) //约束条件:是否还能装下货物w[k]
{
Backtrack(k+1, cw+w[k], upperBound);
if (finished)
{
return;
}
}
if (upperBound - w[k] > maxw) //限界条件:剩余货物的最优装载是否比当前的最优装载更好
{
Backtrack(k+1, cw, upperBound-w[k]);
if (finished)
{
return;
}
}
}
}
int main(void)
{
while(scanf("%d%d", &c1, &c2) != EOF) //两艘船的装载量
{
scanf("%d", &n); //货物数量
int totalw = 0;
int i;
for (i = 0; i < n; i++)
{
scanf("%d", &w[i]); //每个货物的重量
totalw += w[i];
}
maxw = 0;
finished = false;
Backtrack(0, 0, totalw);
if (totalw - maxw <= c2) //船2是否能装下剩余货物
{
printf("ship 1:%d\tship 2:%d\t", maxw, totalw-maxw);
puts("OK!");
}
else
{
puts("NO!");
}
putchar('\n');
}
return 0;
}
/*
5 5
5 2 2 2 2 1
5 5
5 2 2 2 2 2
50 50
3 40 10 30
50 50
3 40 10 40
49 50
3 40 10 49
50 49
3 49 40 10
36 16
8 8 2 5 6 3 6 7 11
*/
第5章 回溯法,装载问题
原文作者:回溯法
原文地址: https://blog.csdn.net/code_pang/article/details/8800721
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/code_pang/article/details/8800721
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。