hdu2191多重揹包單調佇列優化

2021-06-16 12:09:52 字數 728 閱讀 2468

多重揹包單調佇列優化:

dp[c+i*p]=max(dp[c+k*p]+(i-k)*h);

每種揹包的容量p,價值h,c的範圍為0~p-1,i和k的範圍為0~num(能夠取的揹包的數量)

揹包的取法可以看做是劃分為0~p-1這p個容量再加上i個揹包。

dp[c+i*p]=dp[c+k*p]-k*h+i*h;

**:#include#include#include#include#include#include#include#define maxn 2000

#define inf 0xfffffff

#define min(a,b) ab?a:b

using namespace std;

struct node

;node q[maxn];

int dp[maxn];

int n,m,p,h,num,head,tail,nowf;

int main()

{ int t;

scanf("%d",&t);

while(t--)

{memset(dp,0,sizeof(dp));

scanf("%d%d",&n,&m);//總錢數n

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

{scanf("%d%d%d",&p,&h,&num);//**,重量,袋數

num=min(num,n/p);

for(int j=0;j

hdu2191多重揹包單調佇列優化

模板,果然dp還是要從零開始補 kk 樸素方法,用 f i,j 表示考慮前 i 個物品,j 元錢最多能獲得多少價值,下面用 n 表示物品種類數,m 表示總錢數 f i,j max f i 1,j k cdot w i k cdot v i k le num i 換一種形式,因為是 k cdot w ...

hdu 2191 多重揹包的單調佇列優化

多重揹包單調佇列優化是思想是。普通的dp為 dp i j max 其實你可以發現對能更新j是j和乙個剩餘類。也就是 0,v i 2v i 3v i 4v i 1 1 v i 1 2v i 1 3v i v i 1,2 v i 1.更新值存在乙個剩餘類中,組與組之間不存在更新。那麼實際上我們可以寫dp...

HDU 2191 多重揹包

problem description 急!災區的食物依然短缺!為了挽救災區同胞的生命,心繫災區同胞的你準備自己採購一些糧食支援災區,現在假設你一共有資金n元,而市場有m種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙個充滿了...