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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

53. 多人背包

發布時間:2025/3/21 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 53. 多人背包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

53. 多人背包

★☆?? 輸入文件:bags.in?? 輸出文件:bags.out?? 簡單對比
時間限制:2 s?? 內存限制:128 MB

?

問題描述 DD 和好朋友們要去爬山啦!他們一共有 K 個人,每個人都會背一個包。這些包的容量是相同的,都是 V。可以裝進背包里的一共有 N 種物品,每種物品都有給定的體積和價值。 在 DD 看來,合理的背包安排方案是這樣的:
  • 每個人背包里裝的物品的總體積恰等于包的容量。
  • 每個包里的每種物品最多只有一件,但兩個不同的包中可以存在相同的物品。
  • 任意兩個人,他們包里的物品清單不能完全相同。
  • 在滿足以上要求的前提下,所有包里的所有物品的總價值最大是多少呢? 輸入格式 第一行有三個整數:K、V、N。 第二行開始的 N 行,每行有兩個整數,分別代表這件物品的體積和價值。 輸出格式 只需輸出一個整數,即在滿足以上要求的前提下所有物品的總價值的最大值。 樣例輸入 2 10 5 3 12 7 20 2 4 5 6 1 1 樣例輸出 57 樣例說明 一種可以得到最優解的方案是:第一個人背體積為 7、2、1 的三種物品,價值為 25。第二個人背體積為 3、7 的兩種物品,價值為 32。總價值 57。 數據范圍 總人數 K<=50。 每個背包的容量 V<=5000。 物品種類數 N<=200。 其它正整數都不超過 5000。 輸入數據保證存在滿足要求的方案。

    AC代碼:

    ?

    //背包問題第K優解 #include<cstdio> #include<cstring> using namespace std; const int N=5e4+5; int n,m,K,ans,f[55][N],q1[N],q2[N]; int main(){freopen("bags.in","r",stdin); freopen("bags.out","w",stdout); scanf("%d%d%d",&K,&m,&n);memset(f,-0x3f,sizeof f);//*****f[1][0]=0;//f[i][j]表示第i個人在體積容量為j下可獲得的最大價值for(int i=1,v,c;i<=n;i++){scanf("%d%d",&v,&c);for(int j=m;j>=v;j--){for(int k=1;k<=K;k++){q1[k]=f[k][j];q2[k]=f[k][j-v]+c;}//f[i][j]=merge(f[k][j-v]+v) 維護單調隊列 //要求每個最優 即累加前k優解for(int h1=1,h2=1,cnt=1;cnt<=K;cnt++){if(q1[h1]>q2[h2]) f[cnt][j]=q1[h1++];else f[cnt][j]=q2[h2++];//來自歸并排序 }}}for(int i=1;i<=K;i++) ans+=f[i][m];printf("%d\n",ans);return 0; }

    ?

    轉載于:https://www.cnblogs.com/shenben/p/6046198.html

    總結

    以上是生活随笔為你收集整理的53. 多人背包的全部內容,希望文章能夠幫你解決所遇到的問題。

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