傳送門
現有n個物品,序號分別為1, 2, ... , n。對於每個i(1 ≤ i ≤ n),物品i有乙個體積wi和乙個價值vi。
小明想在這n個物品中選取一些放到揹包裡帶回家。已知揹包的容積為w,這意味著所帶物品的總體積不能超過w。
求出小明可以帶回家的物品總價值可能的最大值。
constraints
input
標準輸入格式如下:
nww1v1w2v2:wnvnoutput
輸出小明可以帶回家的物品總價值可能的最大值。
sample input 1
3 8sample output 13 30
4 50
5 60
90把物品1和物品3帶回家,此時它們的總體積為3 + 5 = 8,總價值為30 + 60 = 90最大。
sample input 2
1 1000000000sample output 21000000000 10
10sample input 3
6 15sample output 36 55 6
6 46 6
3 57 2
17物品2, 4和5可以被帶回家,此時它們的總體積為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種菜 每種菜可購買一次。已知每種菜的 以及卡上的餘額,問最少...