01揹包變形

2022-06-23 23:33:11 字數 1887 閱讀 3394

傳送門

現有n個物品,序號分別為1, 2, ... , n。對於每個i(1 ≤ i ≤ n),物品i有乙個體積wi和乙個價值vi

小明想在這n個物品中選取一些放到揹包裡帶回家。已知揹包的容積為w,這意味著所帶物品的總體積不能超過w

求出小明可以帶回家的物品總價值可能的最大值。

constraints

input

標準輸入格式如下:

nww1v1w2v2:wnvn
output

輸出小明可以帶回家的物品總價值可能的最大值。

sample input 1

3 8

3 30

4 50

5 60

sample output 1

90
把物品1和物品3帶回家,此時它們的總體積為3 + 5 = 8,總價值為30 + 60 = 90最大。

sample input 2

1 1000000000

1000000000 10

sample output 2

10
sample input 3

6 15

6 55 6

6 46 6

3 57 2

sample output 3

17
物品2, 45可以被帶回家,此時它們的總體積為5 + 6 + 3 = 14,總價值為6 + 6 + 5 = 17

如果按照普通的01揹包的板子的複雜的是o(n*w),但是這個題的1 ≤ w ≤ 109,所以肯定會超時

那怎麼辦呢,注意這個題的每乙個體積1 ≤ vi ≤ 103,就是說總體積不會超過1e5,

然後你設定乙個dp[i],為價值為i的最小體積,然後從sumv到1判斷dp[i]是否小於w

#include#include

#include

using

namespace

std;

typedef

long

long

ll;const

int maxn=1e6+100

;ll n,w[maxn],v[maxn];

ll dp[maxn];

ll sum=0

;ll w;

intmain()

memset(dp,

0x3f3f3f3f,sizeof

(dp));

dp[0]=0

;

for(int i=1;i<=n;i++)

} for(int i=sum;i>=1;i--)

}}

01揹包問題變形

一 問題 二 解題思路 三 c 下面是我自己理解寫的,沒有根據標準答案的,那答案在講啥?一直沒法ac,不過還是可以解決問題的。n件物品按單位重量價值降序排序,然後回溯法裝,右結點必要時剪枝,剛好湊成重量為m的若干件物品才能得到乙個解。include define max 50 using names...

0 1揹包變形題

將乙個陣列分成兩部分,不要求兩部分所包含的元素個數相等,要求使得這兩個部分的和的差值最小。比如對於陣列,可以分成和,使得這兩部分的差值最小。這道題為什麼說是0 1揹包問題的變形呢,因為0 1揹包問題是每個蘋果裝或者不裝,使得能裝的總重量最重,這道題也類似,什麼時候兩個陣列的和的差值最小呢?當然是都為...

變形的01揹包

電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功 即使購買後卡上餘額為負 否則無法購買 即使金額足夠 所以大家都希望盡量使卡上的餘額最少。某天,食堂中有n種菜 每種菜可購買一次。已知每種菜的 以及卡上的餘額,問最少...