01揹包變形

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

傳送門

現有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--)

}}

homework 01

選了電子版 大全2英文版 完整清晰版 chm 窮逼沒錢買書好煩躁t t 最樸素最暴力的方法是列舉所有的sum i j ,算出其值然後取最大。...

vue 01

1 有 紅 黃 藍 三個按鈕,以及一個200x200矩形框box,點選不同的按鈕,box的顏色會被切換為指定的顏色 黃色藍色 2 有一個20...

homework 01

我的github賬戶名是firedamp。 其實我最一開始看到最大子序列的和這個題目,最先想到的就是最簡單的o n 3 的演算法,在課堂上教的也確實是這個程式,但是這種演算法的時間複雜度必然是最高的,在資料比較大的時候需要付出很大的代價,於是我開始尋求新的方法,在參考了ta的部落格之後,我對那種o n 的...