码迷,mamicode.com
首页 > 编程语言 > 详细

noj算法 装载问题 回溯法

时间:2018-09-30 21:52:30      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:最优   mes   pre   回溯   col   end   span   iostream   bsp   

描述:

 

有两艘船,载重量分别是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 2
8 7
7 9 2
8 8
0 0 0

输出样例:

 

Yes
No

 

题解:

       变形的01背包问题,先按最优解把c1装好,在看剩下的集装箱是否小于c2的容量。

 

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
int c1,c2,n,s,w[11],b,f1[11],f2[11],cw;   //cw是当前最优解,b是记录的最优解,

void fun(int i)
{
    if(i>n)
    {
        if(cw>b)
        {
            for(int j=1;j<=n;j++)
                f2[j]=f1[j];
            b=cw;
        }
        return;
    }
    s-=w[i];
    if(cw+w[i]<=c1){
        f1[i]=1;
        cw+=w[i];
        fun(i+1);
        cw-=w[i];
    }
    if(cw+s>b)
    {
        f1[i]=0;
        fun(i+1);
    }
    s+=w[i];
}

int main()
{
    int i;
    while(1){
        cin>>c1>>c2>>n;
        b=0;
        s=0;
        cw=0;
        if(c1==0&&c2==0&&n==0) break;
        for(i=1;i<=n;i++) {cin>>w[i];s+=w[i];}
        fun(1);
        if(s-b<=c2)
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
}

 

 

 

 

 

noj算法 装载问题 回溯法

标签:最优   mes   pre   回溯   col   end   span   iostream   bsp   

原文地址:https://www.cnblogs.com/y1040511302/p/9733340.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!