http://codeforces.com/problemset/problem/3/B
/**
CF3B 贪心
题目大意;给定一个指定容量的背包,有n种物品,每种物品给定体积(1 or 2)和价值,问背包最多能容的价值是多少,并且求出装了哪几个物品
解题思路:背包问题,可惜背包容量过大。采用贪心的思想来做:按照价值/体积的递减顺序排序,从头依次装物品,直到装不下跳出循环。
此时如果背包没有装满,那么肯定差1,有两种方案:1,从后面加价值最大的一个体积为1的物品。2,从前面取价值最小体积为1的物品去掉
然后在后面加上价值最大的一个体积为2的物品,二者取最优
*/
#include <string.h>
#include <algorithm>
#include <iostream>
#include <stdio.h>
using namespace std;
struct note
{
int x,y;
int id,judge;
bool operator < (const note & other)const
{
return x*other.y<other.x*y;
}
} a[1000505];
int n,m,b[1050005];
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<n; i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].id=i+1;
a[i].judge=0;
}
sort(a,a+n);
int sum=0,flag=-1;
for(int i=0; i<n; i++)
{
if(m-a[i].x>=0)
{
sum+=a[i].y;
a[i].judge=1;
m-=a[i].x;
flag=i;
}
else
{
break;
}
}
if(m>0&&flag<n)
{
int sum1=-1,sum2=-1,flag1,flag2=-1,flag3;
///后加1
for(int i=flag+1; i<n; i++)
{
if(a[i].x==1)
{
sum1=sum+a[i].y;
flag1=i;
break;
}
}
///前去1后加2
for(int i=flag; i>=0; i--)
{
if(a[i].x==1)
{
sum2=sum-a[i].y;
flag2=i;
for(int j=flag+1; j<n; j++)
{
if(a[j].x==2)
{
sum2+=a[j].y;
flag3=j;
break;
}
}
break;
}
}
if(sum1>=sum2&&sum1>sum)
{
sum=sum1;
a[flag1].judge=1;
}
else if(sum2>=sum1&&sum2>sum)
{
sum=sum2;
a[flag2].judge=0;
a[flag3].judge=1;
}
}
printf("%d\n",sum);
int num=0;
for(int i=0; i<n; i++)
{
if(a[i].judge==1)
{
b[num++]=a[i].id;
}
}
for(int i=0; i<num; i++)
{
printf(i==num-1?"%d\n":"%d ",b[i]);
}
}
return 0;
}
/**
3 2
1 2
2 7
1 3
3 2
1 2
1 3
1 4
3 3
2 8
2 7
1 3
3 3
2 8
2 7
2 3
3 3
1 4
1 3
2 5
*/