您的位置:首页 > 其它

01背包排序

2017-03-12 13:40 99 查看
https://vjudge.net/contest/150953#problem/D

此题关键 就是排序,刚开始按q排序结果想死都想不出来应该是q-p排

一维的dp

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long

using namespace std;

const int maxn=505,N=5005;
int dp
;
struct edge{
int p,q,v,c;
}e[maxn];
int comp(const edge &a,const edge &b)
{
return a.c<b.c;
}
int main()
{
int t,n,W;
while(~scanf("%d%d",&n,&W)){
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
cin>>e[i].p>>e[i].q>>e[i].v;
e[i].c=e[i].q-e[i].p;
}
sort(e,e+n,comp);
for(int i=0;i<n;i++)
for(int j=W;j>=e[i].q;j--)
{
dp[j]=max(dp[j],dp[j-e[i].p]+e[i].v);
}
cout<<dp[W]<<endl;
}
return 0;
}


二维的dp

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long

using namespace std;

const int maxn=505,N=5005;
int dp[maxn]
;
struct edge{
int p,q,v,c;
}e[maxn];
int comp(const edge &a,const edge &b)
{
return a.c<b.c;
}
int main()
{
int t,n,W;
while(~scanf("%d%d",&n,&W)){
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
cin>>e[i].p>>e[i].q>>e[i].v;
e[i].c=e[i].q-e[i].p;
}
sort(e,e+n,comp);
for(int i=0;i<n;i++)
for(int j=W;j>=0;j--)
{
if(j>=e[i].q)dp[i+1][j]=max(dp[i][j],dp[i][j-e[i].p]+e[i].v);
else dp[i+1][j]=dp[i][j];
}
cout<<dp
[W]<<endl;
}
return 0;
}
/*
2 10
10 15 10
5 10 5
3 10
5 10 5
3 5 6
2 7 3
5
11
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: