1. 程式人生 > >完美世界筆試題-小萌的包裹

完美世界筆試題-小萌的包裹

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, int
packNum, 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.

以下是我的輸出案例:

技術分享

完美世界筆試題-小萌的包裹