53. 多人背包
?
53. 多人背包
★☆?? 輸入文件:bags.in?? 輸出文件:bags.out?? 簡單對比時(shí)間限制:2 s?? 內(nèi)存限制:128 MB
?
問題描述 DD 和好朋友們要去爬山啦!他們一共有 K 個(gè)人,每個(gè)人都會(huì)背一個(gè)包。這些包的容量是相同的,都是 V。可以裝進(jìn)背包里的一共有 N 種物品,每種物品都有給定的體積和價(jià)值。 在 DD 看來,合理的背包安排方案是這樣的:AC代碼:
?
//背包問題第K優(yōu)解 #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個(gè)人在體積容量為j下可獲得的最大價(jià)值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) 維護(hù)單調(diào)隊(duì)列 //要求每個(gè)最優(yōu) 即累加前k優(yōu)解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; }?
轉(zhuǎn)載于:https://www.cnblogs.com/shenben/p/6046198.html
總結(jié)
- 上一篇: hive整合phoenix
- 下一篇: JavaCC首页、文档和下载 - 语法分