洛谷 1858 多人背包
生活随笔
收集整理的這篇文章主要介紹了
洛谷 1858 多人背包
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.luogu.org/problem/show?pid=1858
題目描述
DD 和好朋友們要去爬山啦!他們一共有 K 個人,每個人都會背一個包。這些包的容量是相同的,都是 V。
可以裝進背包里的一共有 N 種物品,每種物品都有給定的體積和價值。
在 DD 看來,合理的背包安排方案是這樣的:
每個人背包里裝的物品的總體積恰等于包的容量。
每個包里的每種物品最多只有一件,但兩個不同的包中可以存在相同的物品。
任意兩個人,他們包里的物品清單不能完全相同。
在滿足以上要求的前提下,所有包里的所有物品的總價值最大是多少呢?
輸入輸出格式
輸入格式:
?
第一行三個數K、V、N
接下來每行兩個數,表示體積和價值
?
輸出格式:
?
前k優解的價值和
?
輸入輸出樣例
輸入樣例#1:2 10 5 3 12 7 20 2 4 5 6 1 1 輸出樣例#1:
57
說明
對于100%的數據,K\le 50,V\le 5000,N\le 200K≤50,V≤5000,N≤200
?
dp[i][j] 表示體積為i時的第j優解
取能夠更新的前k優解,排好序后 賦值給dp[i][j]
#include<cstdio> #include<cstring> #include<iostream>#define N 201 #define M 5001 #define K 51using namespace std;int v[N],w[N]; int f[M][K],tmp[K];void read(int &x) {x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } }int main() {int k,m,n;read(k); read(m); read(n);for(int i=1;i<=n;i++) read(v[i]),read(w[i]);int pos,a,b;memset(f,-63,sizeof(f));f[0][1]=0;for(int i=1;i<=n;i++)for(int j=m;j>=v[i];j--) {pos=a=b=1;while(pos<=k){if(f[j][a]>=f[j-v[i]][b]+w[i]) tmp[pos++]=f[j][a++];else tmp[pos++]=w[i]+f[j-v[i]][b++];}for(pos=1;pos<=k;pos++) {f[j][pos]=tmp[pos];printf("%d %d %d %d\n",i,j,pos,f[j][pos]);}}int ans=0; for(int i=1;i<=k;i++) ans+=f[m][i];printf("%d",ans);return 0; }?
轉載于:https://www.cnblogs.com/TheRoadToTheGold/p/7657912.html
總結
以上是生活随笔為你收集整理的洛谷 1858 多人背包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java简单知识梳理
- 下一篇: mysql -存储过程的学习