由于背包的容量太大导致不能用递推的01背包,也不是我想象中的贪心,而是搜索,不仅要排序,还要后缀优化,尼玛,都没听说过啊,要不是暑假做01背包的课件,boss当时说了有递推和递归,我都不知道可以写成搜索……
//358MS 1788K 1372B C++ 2016-09-20 11:12:56
#include
#include
#include
#include
using namespace std;
struct node
{
long long value,cost;
}num[120];
bool cmp(node x,node y)
{
return x.cost>y.cost;
}
long long numvalue[120],numcost[120];
int n;
long long sum,tot;
void dfs(int x,long long costsum,long long valuesum)
{
//printf("x=%d,costsum=%lld,valuesum=%lld\n",x,costsum,valuesum);
if(x==n+1)
{
if(valuesum>tot)tot=valuesum;
return;
}
if(valuesum+numvalue[x]<=tot)return;
if(costsum+numcost[x]<=sum)
{
if(valuesum+numvalue[x]>tot)tot=valuesum+numvalue[x];
// printf("tot=%lld\n",tot);
return;
}
if(costsum+num[x].cost<=sum)
dfs(x+1,costsum+num[x].cost,valuesum+num[x].value);
dfs(x+1,costsum,valuesum);
}
int main()
{
// freopen("cin.txt","r",stdin);
while(~scanf("%d%lld",&n,&sum))
{
for(int i=1;i<=n;i++)scanf("%lld%lld",&num[i].cost,&num[i].value);
sort(num+1,num+1+n,cmp);
numvalue[n+1]=numcost[n+1]=0;
for(int i=n;i>=1;i--)numvalue[i]=numvalue[i+1]+num[i].value,numcost[i]=numcost[i+1]+num[i].cost;
// for(int i=1;i<=n;i++)printf("i=%d,value=%lld,cost=%lld\n",i,numvalue[i],numcost[i]);
tot=0LL;
dfs(1,0LL,0LL);
cout<