53. 多人背包
?
53. 多人背包
★☆?? 輸入文件:bags.in?? 輸出文件:bags.out?? 簡單對比時間限制:2 s?? 內存限制:128 MB
?
問題描述 DD 和好朋友們要去爬山啦!他們一共有 K 個人,每個人都會背一個包。這些包的容量是相同的,都是 V。可以裝進背包里的一共有 N 種物品,每種物品都有給定的體積和價值。 在 DD 看來,合理的背包安排方案是這樣的: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
總結
- 上一篇: hive整合phoenix
- 下一篇: VM虚拟机下安装CentOS_6.5_x