洛谷 P1858 多人背包
题目描述
求01背包前k优解的价值和
输入输出格式
输入格式:
第一行三个数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
思路:求01背包的前k优解的模板题。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 210 using namespace std; int K,V,N; int ans,cur; int f[5010][51]; int v[MAXN],val[MAXN]; int main(){ scanf("%d%d%d",&K,&V,&N); for(int i=1;i<=N;i++) scanf("%d%d",&v[i],&val[i]); for(int i=1;i<=N;i++){ for(int j=min(V,cur+v[i]);j>=v[i];j--){ int A[51],B[51]; for(int kk=1;kk<=K;kk++){ A[kk]=f[j-v[i]][kk]||j==v[i]&&kk==1?f[j-v[i]][kk]+val[i]:0; B[kk]=f[j][kk]; } int a=1,b=1,c=1; A[K+1]=-1,B[K+1]=-1; while(c<=K&&(A[a]!=-1||B[b]!=-1)){ if(A[a]>B[b]) f[j][c]=A[a++]; else f[j][c]=B[b++]; c++; } } cur=min(V,cur+v[i]); } for(int i=1;i<=K;i++) ans+=f[V][i]; cout<<ans; }
细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。
雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。