二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】
二維費用的背包問題是指:對于每件物品,具有兩種不同的費用;選擇這件物品必須同時付出這兩種代價;對于每種代價都有一個可付出的最大值(背包容量)。問怎樣選擇物品可以得到最大的價值。設這兩種代價分別為代價1和代價2,第i件物品所需的兩種代價分別為a[i]和b[i]。兩種代價可付出的最大值(兩種背包容量)分別為V和U。物品的價值為w[i]。
算法
費用加了一維,只需狀態也加一維即可。設f[i][v][u]表示前i件物品付出兩種代價分別為v和u時可獲得的最大價值。狀態轉移方程就是:
f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}
如前述方法,可以只使用二維的數組:當每件物品只可以取一次時變量v和u采用逆序的循環,當物品有如完全背包問題時采用順序的循環。當物品有如多重背包問題時拆分物品。這里就不再給出偽代碼了,相信有了前面的基礎,你能夠自己實現出這個問題的程序。
物品總個數的限制
有時,“二維費用”的條件是以這樣一種隱含的方式給出的:最多只能取M件物品。這事實上相當于每件物品多了一種“件數”的費用,每個物品的件數費用均為1,可以付出的最大件數費用為M。換句話說,設f[v][m]表示付出費用v、最多選m件時可得到的最大價值,則根據物品的類型(01、完全、多重)用不同的方法循環更新,最后在f[0..V][0..M]范圍內尋找答案。
復數域上的背包問題
另一種看待二維背包問題的思路是:將它看待成復數域上的背包問題。也就是說,背包的容量以及每件物品的費用都是一個復數。而常見的一維背包問題則是實數域上的背包問題。(注意:上面的話其實不嚴謹,因為事實上我們處理的都只是整數而已。)所以說,一維背包的種種思想方法,往往可以應用于二位背包問題的求解中,因為只是數域擴大了而已。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n, m, k, s; int a[110],b[110]; int dp[110][110]; int main() {while(~scanf("%d%d%d%d", &n, &m, &k, &s)){memset(dp, 0, sizeof(dp));for(int i =1; i<=k; i++){scanf("%d%d", &a[i], &b[i]);}for(int i =1; i<=k; i++){for(int p=1; p<=s; p++) //總的妖怪數{for(int c=b[i];c<=m;c++){dp[p][c]=max(dp[p][c],dp[p-1][c-b[i]]+a[i]);}}}int i;for( i =1;i<=m; i++){if(dp[s][i]>=n){break; //即使最后都沒找打i=m+1了}}if(i<=m)printf("%d\n",m-i);elseputs("-1");}return 0; }小明---
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n, v1, v2, k; int cost[110], tenige[110], val[110]; int dp[110][110][110]; int main() {while(~scanf("%d%d%d%d", &n, &v1, &v2, &k)){memset(dp, 0, sizeof(dp));for(int i =0; i<n; i++){scanf("%d%d%d", &cost[i], &tenige[i], &val[i]);}for(int i =0; i<n; i++){for(int j =v1; j>=0; j--){for(int a= v2; a>=0; a--){for(int b = k ; b>=0; b--){int tem =0;if(j>=cost[i])tem=max(tem,dp[j-cost[i]][a][b]+val[i]);if(a>=tenige[i])tem=max(tem, dp[j][a-tenige[i]][b]+val[i]);if(b>=1)tem=max(tem, dp[j][a][b-1]+val[i]);dp[j][a][b]=max(tem,dp[j][a][b]);}}}}printf("%d\n", dp[v1][v2][k]);}return 0; }
?
總結
以上是生活随笔為你收集整理的二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维费用 买糖果
- 下一篇: HU 3496 Watch The Mo