日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】

發布時間:2025/3/18 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二维费用 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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。