在这里插入图片描述
import java.util.Scanner;
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n=input.nextInt();
int t=input.nextInt();
int w[]=new int[n+1];
int v[]=new int[n+1];
for(int i=1;i<=n;i++){
v[i]=input.nextInt();
w[i]=input.nextInt();
}
int dp[][]=new int[n+1][t+1];
ArrayList<Integer> list=new ArrayList<>();
for(int i=0,j=0;j<=t;j++){
dp[i][j]=0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=t;j++){
dp[i][j]=dp[i-1][j];
if(j>=w[i]){
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
}
}
}
int i=n,j=t;
while(i>=1&&j>=0){
if(dp[i][j]==dp[i-1][j]){
i--;
}
else{
list.add(i);
//注意,因为w[i]的值是对应于i没变的时候,所以应该放在前面
j=j-w[i];
i--;
}
}
System.out.println(dp[n][t]);
for(i=list.size()-1;i>=0;i--)
System.out.print(list.get(i)+" ");
input.close();
}
}在这里插入代码片
在这里插入图片描述
方法二:
import java.util.Scanner;
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n=input.nextInt();
int t=input.nextInt();
int w[]=new int[n+1];
int v[]=new int[n+1];
for(int i=1;i<=n;i++){
v[i]=input.nextInt();
w[i]=input.nextInt();
}
int path[][]=new int[n+1][t+1];
ArrayList<Integer> list=new ArrayList<>();
int dp[]=new int[t+1];
for(int i=1;i<=n;i++){
for(int j=t;j>=w[i];j--){
if(dp[j-w[i]]+v[i]>dp[j]){
dp[j]=dp[j-w[i]]+v[i];
path[i][j]=1;
}
}
}
int i=n,j=t;
while(i>=1&&j>=0){
if(path[i][j]!=0){
list.add(i);
j-=w[i];
}
i--;
}
System.out.println(dp[t]);
for(i=list.size()-1;i>=0;i--)
System.out.print(list.get(i)+" ");
input.close();
}
}在这里插入代码片