1. 程式人生 > >noj算法 裝載問題 回溯法

noj算法 裝載問題 回溯法

name urn out clas pan 結束 main str nbsp

描述:

有兩艘船,載重量分別是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算法 裝載問題 回溯法