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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【分组背包问题 (HDU 3535 )】

發布時間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【分组背包问题 (HDU 3535 )】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用到至少選擇一個,所以沒有空間優化
分組背包問題:
常見的三種分組問題:
分成K組:
1、每組最多只能取一件物品
一維數組偽碼:
for 0 to K ?對每一組進行
? ? for W to 0 ? 對每一個代價進行判斷 ///1
? ? ?for all item i in group k ? ? ? ?///2 這行個互換好像也對
? ? ?dp[w]=max(dp[w],dp[w-c[i]]+v[i]; ? 每個重量保證的只有一件物品來取最大值
2、每組隨意取(為01背包問題)******摘抄網絡**既然上面的順序是限制每組最多取一個,那調換一下順序即可,其實就是01背包。******
一維偽碼:
for 0 t0 K
? ? for all item i in group k
? ? ? for W to 0
? ? ? dp[w]=max(dp[w],dp[w-c[i]]+v[i]);
3、每組至少取一個
沒見過一維的偽代碼
用二維:
dp[ki][j]表示當前組的一件物品不選
dp[ki-1][j-w[i]]+v[i] 表示這是在ki組選第一個
dp[ki][j-w[i]]+v[i] 表示在這個ki組中再次選一個
dp[ki][j](處理完后的值)=max(dp[ki][j],dp[ki-1][j-w[i]]+v[i],dp[ki][j-w[i]]+v[i]) max分開的時候要注意順序 max(dp[ki][j],dp[ki-1][j-w[i]]+v[i])......
在初始化時是ki==0(沒有組)這時是dp[0][j]=0 其余的是-inf ******解決一件物品都不取的問題

?

#include <iostream> #include <stdio.h> #include <algorithm> #include <cstring> #define X 10005 #define inf 0x3f3f3f3f using namespace std; int main() {int n,t;int m,s;cin>>n>>t;int dp[105][105];int c[105],g[105];memset(dp,-inf,sizeof(dp));memset(dp[0],0,sizeof(dp[0]));for(int i=1;i<=n;++i)//k組{cin>>m>>s;for(int j=0;j<m;++j){scanf("%d%d",&c[j],&g[j]);}if(s==0){// for(int j=0;j<=t;++j)// dp[i][j]=-1000000;for(int j=0;j<m;++j)for(int p=t;p>=c[j];--p){dp[i][p]=max(dp[i][p],dp[i][p-c[j]]+g[j]);dp[i][p]=max(dp[i][p],dp[i-1][p-c[j]]+g[j]);}}else if(s==1){for(int j=0;j<=t;++j){dp[i][j]=dp[i-1][j];//當前i個組繼承前i-1個組}for(int j=0;j<m;++j){for(int p=t;p>=c[j];--p){dp[i][p]=max(dp[i][p],dp[i-1][p-c[j]]+g[j]);}}}else if(s==2){for(int j=0;j<=t;++j){dp[i][j]=dp[i-1][j];}for(int j=0;j<m;++j){for(int p=t;p>=c[j];--p){// dp[i][p]=max(dp[i][p],dp[i-1][p]);//不取dp[i][p]=max(dp[i][p],dp[i][p-c[j]]+g[j]);//多個//dp[i][p]=max(dp[i][p],dp[i-1][p-c[j]]+g[j]);//一個}}}}// if(dp[n][t]<0)// cout<<-1<<endl;// elsecout<<max(dp[n][t],-1)<<endl;return 0; }

?

總結

以上是生活随笔為你收集整理的【分组背包问题 (HDU 3535 )】的全部內容,希望文章能夠幫你解決所遇到的問題。

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