装载问题(记录可行解)

来源:互联网 发布:u盘格式化恢复数据 编辑:程序博客网 时间:2024/05/29 02:41

描述:

有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。

输入:

多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。

输出:

对于每个测例在单独的一行内输出Yes或No。

输入样例:

7 8 28 77 9 28 80 0 0

输出样例:

YesNo



#include <iostream>using namespace std;int c1, c2;         //分别载重量int n;              //集装箱数量int w[100];         //集装箱重量int cw;             //c1当前载重量int bestw;          //c1当前最优载重量int r;              //剩余集装箱重量int x[100];         //当前解int bestx[100];      //当前最优解void Backtrack(int i){    if(i > n)    {        //当前解由于最优解,更新之        if(cw > bestw)        {            for(int j = 1; j <= n; j++)                bestx[j] = x[j];            bestw = cw;        }        return;    }    //搜索子树,放入或不放入    r -= w[i];              //剩余容量集合去掉w[i]    if(cw + w[i] <= c1)     //可放入,且放入    {        x[i] = 1;           //放入        cw += w[i];        Backtrack(i+1);        cw -= w[i];    }    if(cw + r > bestw)      //剩余容量集合依然是去掉w[i],因为w[i]不放入    {        x[i] = 0;        Backtrack(i+1);    }    r += w[i];              //回溯}int main(){    while((cin >> c1 >> c2 >> n) && n)    {        cw = 0;             //每组样例初始化        r = 0;        bestw = 0;        for(int i = 1; i <= n; i++)        {            cin >> w[i];            r += w[i];        }        Backtrack(1);        if(r-bestw <= c2)            cout << "Yes" << endl;        else            cout << "No" << endl;    }    return 0;}


0 0
原创粉丝点击