7-1 装载问题 (10 分)(思路+详解)
生活随笔
收集整理的這篇文章主要介紹了
7-1 装载问题 (10 分)(思路+详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:題目 Come 寶寶!!
輸出格式:
輸出所有可行的方案數量
輸入樣例1:
3 50 50 10 40 40結尾無空行
輸出樣例1:
結尾無空行
輸入樣例2:
結尾無空行
輸出樣例2:
二:思路
1.這個解的空間選擇的是子集樹
2.遞歸函數參數
backtacking()
把所有的可行解都記錄下來
3.返回的結果
用一個vector<vector >ans:來存結果
vector path:用來存每次的集裝箱所裝的船的序號
將到達葉節點的時候集裝箱(所裝船的序號存進去)
3.遞歸終止條件
path.size() == n時候終止
這時候就是遞歸到達葉節點的時候 有了一種可行解
4.橫向的單層的for循環為遍歷所有集裝箱的重量,縱向的遞歸是不斷為剩下的集裝箱選擇船號
5.對結果的選擇:具體看代碼
6.示例舉例
將集裝箱1和2裝上第一艘輪船,而將集裝箱3裝上第二艘輪船; 112
將集裝箱1和2裝上第二艘輪船,而將集裝箱3裝上第一艘輪船; 221
將集裝箱1和3裝上第一艘輪船,而將集裝箱2裝上第二艘輪船; 121
將集裝箱1和3裝上第二艘輪船,而將集裝箱2裝上第一艘輪船; 212
7:圖示
三:上碼
/**思路:1.這個解的空間選擇的是子集樹2.遞歸函數參數backtacking()把所有的可行解都記錄下來 3.返回的結果用一個vector<vector<int> >ans:來存結果vector<int> path:用來存每次的集裝箱所裝的船的序號 將到達葉節點的時候集裝箱(所裝船的序號存進去) 3.遞歸終止條件path.size() == n時候終止這時候就是遞歸到達葉節點的時候 有了一種可行解4.橫向的單層的for循環為遍歷所有集裝箱的重量,縱向的遞歸是不斷為剩下的集裝箱選擇船號5.對結果的選擇:具體看代碼 6.示例舉例將集裝箱1和2裝上第一艘輪船,而將集裝箱3裝上第二艘輪船; 112將集裝箱1和2裝上第二艘輪船,而將集裝箱3裝上第一艘輪船; 221將集裝箱1和3裝上第一艘輪船,而將集裝箱2裝上第二艘輪船; 121將集裝箱1和3裝上第二艘輪船,而將集裝箱2裝上第一艘輪船; 212**/ #include<bits/stdc++.h> using namespace std;vector<vector<int> > ans;//用來存放每次的可行解 vector<int> path;//用來存放單次的可行解 int n,c1,c2;void backtacking(){//遞歸終止條件if (path.size() == n) {ans.push_back(path);return;} for (int i = 1; i <= 2; i++) {path.push_back(i);backtacking();path.pop_back(); }} int main(){vector<int> v;int count = 0;cin >> n >> c1 >> c2;for (int i = 0; i < n; i++) {int num;cin >> num;v.push_back(num); }backtacking();for (int i = 0; i < ans.size(); i++) {int sumWeight1 = 0;//記錄在船1上的累計重量 int sumWeight2 = 0;//記錄在船2上的累計重量 for (int j = 0; j < n; j++) {if (ans[i][j] == 1){ sumWeight1 += v[j]; }else{sumWeight2 += v[j];} // cout << ans[i][j] << ' ';}// cout << endl;if(sumWeight1 <= c1 && sumWeight2 <= c2 && sumWeight1 != 0 && sumWeight2 != 0){//這里是比較裝的重量和船的載重 count++;// cout << sumWeight1 << ' ' << sumWeight2; }}cout << count; }
加油 boy!!! 下雪了 哈哈哈 今年的第一場雪!!!
總結
以上是生活随笔為你收集整理的7-1 装载问题 (10 分)(思路+详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑微信卡顿、闪退问题如何解决
- 下一篇: 7-2 批处理作业调度 (10 分)(思