/*
01 背包
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=808
题意:n个物品,往背包里放,有真实体积和放入背包所需体积
问最多可以放入背包的最大体积
思路:先对物品进行优先级排序,然后按01背包做,往背包放的时候
需要判断背包放下该物品的所需的额外空间够不够
*/
# include <stdio.h>
# include <iostream>
# include <string.h>
# include <string>
# include <algorithm>
using namespace std;
typedef struct Node
{
int w,x;
double f;
}Node;
int dp[10010];
int cmp(const Node &A,const Node &B)
{
return A.f > B.f;
}
int main()
{
// freopen("in.txt","r",stdin);
int n,L,i,j,k;
while(scanf("%d%d",&n,&L)!=EOF)
{
Node num[n+1];
for(i=0;i<n;++i)
{
cin >> num[i].w >> num[i].x;
num[i].f = num[i].x*1.0/num[i].w;
}
memset(dp,0,sizeof(dp));
sort(num,num+n,cmp);//放东西的优先级影响最终结果
int ans=0;
for(i=0;i<n;++i)
{
for(j=L;j>=num[i].w;--j)
{
// 判断一下额外需要的空间是否足够
if(L-j >= num[i].x-num[i].w)
{
dp[j]=max(dp[j],dp[j-num[i].w]+num[i].w);
ans=max(dp[j],ans);
}
}
}
cout << ans <<endl;
}
return 0;
}
01背包--NYOJ蚂蚁的难题(八)
最新推荐文章于 2019-04-29 16:27:38 发布