首先是01揹包
for(int i=1;i
<=n;i++)
for(int j=v;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
然後是完全揹包
for(int i=1;i
<=n;i++)
for(int j=w[i];j
<=v;j++)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
多重揹包基礎版
for(int i=1;i
<=n;i++)
for(int j=v;j>=w[i];j--)
for(int k=1;k<=c[i];k++)
if(k*w[i]
<=j)dp[j]=max(dp[j],dp[j-k*w[i]]+k*v[i]);
多重揹包二進位制優化時間版
for(int i=1;i<=n;i++)
if(c[i])
}
注意二進位制拆分後剩餘部分不要忘記
二維費用揹包
for(int i=1;i
<=n;i++)
for(int j=w[i];j
<=v;j++)
for(int k=u[i];k<=w;k++)
dp[j]
[k]=max(dp[j]
[k],dp[j-w[i]][k-u[i]]+v[i]);
注意這是個完全揹包
然後是分組揹包,這個有點難
給個題目poj 3046 題解
模板是這樣子的
for 所有的組k
forj=v..
0for 所有的i屬於組k
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
最後是樹形dp模板(要用到dfs)
void dfs(int x)
}
這幾天多做了幾個揹包問題,感覺自己還是對揹包的理解不太深,知識潛力能力太淺
後續如果我還有一些想法,我會繼續更新。
動態規劃基礎
to find the fastest way through a factory.這個問題我簡述下 乙個產品的出場要經過多道工序的加工方可出場。某工廠有兩條工作線,每條工作線都具有n道工序。並且對應位置的工序執行相同的操作,但是他們具有不同的時間代價。在同一條工作線當中,由當前工序轉移到下一道工序...
動態規劃(基礎)
1 揹包 2 最長上公升子串行 3 線性dp 區間dp 4 記錄結果再利用的動態規劃 5 狀態壓縮dp 1 2 3 hdu dp題集 1 揹包問題 1 演算法 01 揹包問題,畫 2 挑戰程式設計競賽 3 揹包九講 4 揹包九講 自學筆記 1 完全揹包自學筆記 題目一覽表 考察知識點 完成時間 a ...
模板 動態規劃 數字dp
includeusing namespace std define ll long long int a 20 ll dp 20 20 可能需要的狀態1 20 可能需要的狀態2 不同題目狀態不同 ll dfs int pos,int state1 可能需要的狀態1 int state2 可能需要的狀...