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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷 1858 多人背包

發布時間:2025/3/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 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 200K50,V5000,N200

?

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 多人背包的全部內容,希望文章能夠幫你解決所遇到的問題。

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