【NOJ1328】【回溯_DFS】裝載問題加強版
阿新 • • 發佈:2018-11-23
1328.裝載問題加強版
時限:1000ms 記憶體限制:10000K 總時限:3000ms
描述
現在碼頭有一批重量不同的貨物,有三艘裝載量不同的貨船,試求出能否一次將貨物裝完
輸入
第一行給出貨物的數量n(n<=10)
第二行有n個整數,分別表示這n個貨物的重量
第三行有3個整數,分別表示三艘貨船的載重量
輸出
若能夠一次裝完輸出Yes,否則輸出No
#include <iostream> using namespace std; int n; int w[11]; int c1,c2,c3; int cur1,cur2; int all; bool dfs(int m); int main() { //輸入資料 cin>>n; all=0; for(int i=0; i<n; i++) { cin>>w[i]; all+=w[i]; //計算所有貨物的總重 } cin>>c1>>c2>>c3; //深搜 if(dfs(0)) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } return 0; } bool dfs(int m) { if(m==n) //所有貨物均已裝完 { if(all-cur1-cur2<=c3) //除去裝入1和2的貨物,如果剩下的貨物能夠裝入3 { return true; } else { return false; } } else { //第m件貨物裝入1 cur1+=w[m]; if(cur1<=c1) { if(dfs(m+1)) { return true; } } cur1-=w[m]; //第m件貨物裝入2 cur2+=w[m]; if(cur2<=c2) { if(dfs(m+1)) { return true; } } cur2-=w[m]; //第m件貨物不裝入1也不裝入2,等著最後裝入3 if(dfs(m+1)) { return true; } return false; } }
【2018/11/20後記】
1、和裝載問題一模一樣。
2、上午還信誓旦旦的說,下週二之前不上CSDN了,真香!怕是要被考試之神懲罰了orz