第5章 回溯法,装载问题

来源:互联网 发布:外国活动策划公司知乎 编辑:程序博客网 时间:2024/05/24 05:32
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define MAX 100int c1, c2;//两船的载重量int n;//货物数量int w[MAX];//货物重量int maxw;//最大装载量bool finished;//已达到装载最大量时,finished为truevoid 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 55 2 2 2 2 15 55 2 2 2 2 250 503 40 10 3050 503 40 10 4049 503 40 10 4950 493 49 40 1036 168 8 2 5 6 3 6 7 11*/

原创粉丝点击