完美世界筆試題-小萌的包裹
阿新 • • 發佈:2017-10-31
urn 枚舉 using col sin 數組 cout include ges
原創、轉載請註明出處
每個物品放或不放,想象一個長度為n的數組,每個位置是0或者是1(放或不放),暴力枚舉的話,復雜度是2n,題目給的時間是1秒,一般n(物品的數量)的規模可達到26,題目給的n的最大值是20,暴力枚舉應該能過,用遞歸枚舉加剪枝肯定能過。
01串可用二進制枚舉,也可用向量枚舉,我用的是遞歸枚舉,方便剪枝(解答樹的枝)。
代碼如下:
#include<iostream> using namespace std; const int maxn = 20; int A[maxn], n, c, bn, ans; void f(int cur, int put, intpackNum, int packMass, int itemNum) { if(packNum > bn) { ans = max(ans, itemNum - 1); return; } if(cur == n || ((put == 1) && (A[cur] > c))) { ans = max(ans, itemNum); return; } if(!put) { f(cur + 1, 0, packNum, packMass, itemNum); f(cur+ 1, 1, packNum, packMass, itemNum); } else { if(A[cur] + packMass > c) { f(cur + 1, 0, packNum + 1, A[cur], itemNum + 1); f(cur + 1, 1, packNum + 1, A[cur], itemNum + 1); } else { f(cur + 1, 0, packNum, packMass + A[cur], itemNum + 1); f(cur + 1, 1, packNum, packMass + A[cur], itemNum + 1); } } } int main() { int t; cin >> t; while(t --) { cin >> n >> c >> bn; for(int i = 0 ;i < n ; i++) { cin >> A[i]; } ans = 0; f(0, 0, 1, 0, 0); f(0, 1, 1, 0, 0); cout << ans << endl; } }
牛客的判錯明顯不對,容量11的背包,比11小的物品有6個,不可能輸出13.
以下是我的輸出案例:
完美世界筆試題-小萌的包裹