思路:动态背包问题
import java.util.*;
class Sugar{
int cat;
int x;
Sugar(int cat,int x,int index){
this.cat=cat;
this.x=x;
}
}
public class Main{
public static void main(String[] args){
Scanner s=new Scanner(System.in);
while(s.hasNext()){
int num=s.nextInt();
int contains=s.nextInt();
Sugar[] sugars=new Sugar[num+1];
for(int i=1;i<=num;i++){
sugars[i]=new Sugar(s.nextInt(),s.nextInt(), i);
}
//能装下所有的情况
if(2*num<=contains){
long cv=0;
for(int i=1;i<=num;i++){
cv+=sugars[i].x;
}
System.out.println(cv);
for(int i=1;i<=num;i++)
System.out.println(i+" ");
}else{
//不能装下所有的情况
int[][] m=new int[num+1][contains+1];
//存放物品1-i集合中 背包大小为J时 可以放下的最高价值
int[]path=new int[num+1];
for(int i=1;i<=num;i++){
m[i][0]=0;
for(int j=1;j<=contains;j++){
if((i==1)&&(j>=sugars[1].cat)){
m[i][j]=sugars[1].x;
}
if(i>1){
if(j>=sugars[i].cat){
m[i][j]=Math.max(m[i-1][j],m[i-1][j-sugars[i].cat]+sugars[i].x);
}else{
m[i][j]=m[i-1][j];
}
}
}
}
int j=contains;
//根据矩阵找到路径
for(int i=num;i>=1;i--){
if(m[i][j]==m[i-1][j] ){
path[i]=0;
}else{
path[i]=1;
j=j-sugars[i].cat;
}
}
System.out.println(m[num][contains]);
if(m[num][contains]==0){
System.out.println("No");
}else{
for(int i=1;i<=num;i++){
if(path[i]==1){
System.out.print(i+" ");
}
}
System.out.println();
}
}
}
}
}