首先上乙個神級的教程,揹包九講
這個教程講解詳細,讀懂了大有裨益。
還有一篇比較有幫助:
首先是乙個完全揹包問題(恰好裝滿):
ac code:
#includeusing namespace std;
const int maxn = 125;
int dp[maxn+5][maxn + 5];
int n = 0;
void solve()
for(int i = 1;i <= maxn;++i)
for(int i = 2;i <= maxn;++i) }}
int main()
return 0;
}
接下來是乙個多重揹包問題:
ac code:
#includeusing namespace std;
const int maxn = 300;
int dp[18][maxn + 5];//dp[i][j]表示使用前i種貨幣,湊出j元的方法數
int n = 0;
void solve()
for(int i = 1;i <= 17;++i)
for(int i = 2;i <= 17;++i)
} /*
for(int i = 1;i <= 4;++i)
} */
}int main()
return 0;
}
上面兩個問題的初始化是一樣的。揹包九講有段話話很重要
初始化的細節問題:
我們看到的求解最優解的揹包問題中,事實和桑有兩種不太相同的問法。
要求」揹包恰好裝滿「 時的最優解
不要求揹包一定要被裝滿時的最優解
我們上面所討論的就是第2種, 不要求揹包一定要被裝滿時的最優解。
一種區別這兩種問法的實現方法是在初始化的時候有所不不同。
如果是第一種問法,要求恰好裝滿揹包,那麼在初始化時除了 dp[0]dp[0] 為0, 其他dp[1…w]均設為−∞dp[1…w]均設為−∞ ,這樣就可以保證最終得到 dp[w]dp[w] 是一種恰好裝滿揹包的最優解
如果並沒有要求必須把揹包裝滿,而是只希望**盡量大,初始化時應該將dp[0…w]dp[0…w] 全部設為0。
這是為什麼呢?可以這樣理解:初始化的dpdp 陣列事實上就是在沒有任何物品可以放入揹包時的合法狀態。如果要求揹包恰好裝滿,那麼此時只有容量為0的揹包可以在什麼也不裝的狀態下被 「恰好裝滿」 ,此時揹包價值為0。其他容量的揹包均沒有合法的解,屬於未定義的狀態,所以都應該被賦值為 −∞−∞ 。當前的合法解,一定是從之前的合法狀態推得的
如果揹包並非必須被裝滿,那麼任何容量的揹包都有乙個合法解 「什麼也不裝」,這個解的價值為0,所以初始化時狀態的值也就全部為0了。
接下來還是乙個多重揹包的問題:
ac code:
#includeusing namespace std;
const int maxn = 8e3 ;
int num[4];
int val[4] = ;
bool dp[maxn+10];
void solve()
} }for(int i = 1;i <= ma+1;++i) }}
int main()
solve();
} return 0;
}
加了最大值最小值限制的多重揹包:
ac code:
#includeusing namespace std;
const int maxn = 100 + 10;
int dp[maxn][maxn][maxn];//dp[i][j][k]表示使用了i種水果,有了j個盤,在第i種水果使用了k個
struct node;
node num[maxn];
#define inf 1e6
int n = 0,m = 0;
void solve()
for(int i = num[1].mi;i <= num[1].ma;++i)
for(int i = 2;i<= n;++i)
dp[i][j+k][k] += dp[i-1][j][l];//由第i-1種轉移而來,所以要遍歷i-1種的情況 }}
} }int ans = 0;
for(int i = num[n].mi;i <= num[n].ma;++i)
printf("%d\n",ans);
}int main()
solve();
} return 0;
}
DP 動態規劃 揹包問題
將乙個容量為v的揹包,物品有兩個屬性,乙個w和乙個v表示體積和屬性值。每種物品只有乙個。要求裝下盡可能多,求最大價值。轉移狀態方程 dp j max dp dp j list i w list i v,dp j 1 include includeusing namespace std struct ...
動態規劃(DP)揹包問題
dp做題的步驟 1.確定狀態變數 dp i dp i j 的含義 2.確定狀態轉移方程 3.確定邊界條件 4.確定遞推順序 題目1 01揹包 有n個重量和價值分別為w和v的物品。從這些物品中挑選總重量不超過w的物品。求所有挑選方案中價值總和的最大值 思路 dp i 1 j 表示從前i個物品中選出總重...
DP動態規劃 揹包問題
具體例子 有n個重量和價值分別為wi,vi的物品,從這些物品中挑選出總重量不超過w的物品,求所有挑選方案中價值總和的最大值。例如 n 4 w,v w 5 dp思想 求出狀態轉移方程,也就是求出遞推式。首先將問題一般化 解決此問題需要2個一維陣列,和1個二維陣列 w i 表示第i個物品的重量,下標從0...