华师一附中OI组
标题:
P1858 多人背包
[打印本页]
作者:
admin
时间:
2018-9-28 16:52
标题:
P1858 多人背包
https://www.luogu.org/problemnew/show/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≤50,V≤5000,N≤200
作者:
universehyf
时间:
2018-10-19 22:28
#include<iostream>
using namespace std;
#define FOR(i,n,m) for(int i=n;i<=m;i++)
#define For(i,n,m) for(int i=n;i>=m;i--)
int k,m,n,x,y,c,cc;
int v[5005],w[5005],t[52];
long long ans,f[5005][52];
int main()
{
cin>>k>>n>>m;FOR(i,1,m) cin>>v[i]>>w[i];
FOR(i,0,n+1) FOR(j,0,k+1) f[i][j]=-1;
f[0][1]=0;FOR(i,1,m) For(j,n,v[i])
{
x=1;y=1;cc=0;
FOR(h,1,k)
{
if(f[j][x]>=f[j-v[i]][y]+w[i]&&f[j][x]!=-1)
{t[h]=f[j][x++];cc++;}
else if(f[j][x]<f[j-v[i]][y]+w[i]&&f[j-v[i]][y]!=-1)
{t[h]=f[j-v[i]][y++]+w[i];cc++;}
else break;
}
FOR(h,1,cc) f[j][h]=t[h];
}
FOR(i,1,k)
{
if(f[n][i]==-1) break;
ans+=f[n][i];
}
cout<<ans;
return 0;
}
复制代码
作者:
universehyf
时间:
2018-10-21 20:49
#include<iostream>
using namespace std;
#define FOR(i,n,m) for(int i=n;i<=m;i++)
#define For(i,n,m) for(int i=n;i>=m;i--)
int k,m,n,x,y,c,cc;
int v[5005],w[5005],t[52];
long long ans,f[5005][52];
int main()
{
cin>>k>>n>>m;FOR(i,1,m) cin>>v[i]>>w[i];
FOR(i,0,n+1) FOR(j,0,k+1) f[i][j]=-1;
f[0][1]=0;FOR(i,1,m) For(j,n,v[i])
{
x=1;y=1;cc=0;
FOR(h,1,k)
{
if(f[j][x]>=f[j-v[i]][y]+w[i]&&f[j][x]!=-1)
{t[h]=f[j][x++];cc++;}
else if(f[j][x]<f[j-v[i]][y]+w[i]&&f[j-v[i]][y]!=-1)
{t[h]=f[j-v[i]][y++]+w[i];cc++;}
else break;
}
FOR(h,1,cc) f[j][h]=t[h];
}
FOR(i,1,k)
{
if(f[n][i]==-1) break;
ans+=f[n][i];
}
cout<<ans;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2