多重揹包單調佇列優化:
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種大公尺,每種大公尺都是袋裝產品,其 不等,並且只能整袋購買。請問 你用有限的資金最多能採購多少公斤糧食呢?後記 人生是乙個充滿了...