超大揹包問題 折半列舉

2021-07-27 21:07:42 字數 748 閱讀 6198

超大揹包問題:有重量和價值分別為wi,vi的n個物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。 1

1 1因為wi,太大,陣列開不了,而我們發現n的數量較少,可以使用折半列舉。

首先列舉前n/2個揹包的所有可能結果,儲存在結構體ps[n].sv  ps[n].sw中,然後按sw排序,從小到大,剔除掉其中滿足(ps[i].sw>ps[j].sw&&ps[i].sv

然後列舉後面n/2個揹包組合的所有可能,算出其sv,sw,然後從上面的結構體中二分查詢 找出符合ps[q].sw<=w-sw時,最大的q,這時ps[q].sv是滿足w-sw重量中的最大價值。總的價值就是ps[q].sv+sv.

#includestruct node

ps[100];

void qsort(struct node a,int l,int r);//快速排序

int binary_find(const struct node a,int l,int r,int x);//二分查詢最大p

int max(int x,int y)

int main(void)

} }qsort(ps,0,((1<>j&1)//計算sw,sv

}if(sw<=w)

}printf("%d\n",res);

}void qsort(struct node *a,int l,int r)

return a[r].sv;

}

超大揹包問題(折半列舉)

超大揹包問題 有重量和價值分別為w i v i 的n個物品,從這些物品中選出總重不超過w的物品,求所有挑選方案中價值總和的最大值 1 n 40 1 w i v i 1e15 1 w 1e15 輸入第一行為n,接著輸入一行w i 和一行v i 最後輸入w佔單獨一行 輸出單獨一行即所有挑選方案中價值總和...

超大揹包問題 (折半列舉)

題意 有重量和價值分別為wi,vi的n個物品。從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。限制條件 1 n 40 1 wi,vi 10 的15次冪 1 w 10的15次冪 輸入 n 4 w v w 5 輸出 7 挑選0 1 3號物品 分析 這個問題是前面介紹過的揹包問題,...

超大揹包問題 折半搜尋

超大揹包問題 有n個重量和價值分別為w i 和v i 的物品,從這些物品中挑選總重量不超過w的物品,求所有挑選方案中價值總和的最大值。其中,1 n 40,1 w i v i 10 15,1 w 10 15.按照普通的dp 思路顯然是無法求解的,揹包的體積太大了,那麼就要換種思考的方向,觀察物品的數量...