AcWing 12. 背包问题求具体方案
原题链接
中等
作者:
Acvv_scl
,
2021-04-13 00:01:30
,
所有人可见
,
阅读 316
解析
- 逆序 求dp原因----最小字典序
- 再升序 反向求解具体方案
import java.util.*;
public class Main{
static int N=1010;
static int []v=new int [N];
static int []w=new int [N];
static int [][]f=new int [N][N];
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
for(int i=1;i<=n;i++){
v[i]=sc.nextInt();
w[i]=sc.nextInt();
}
//求dp的结果
for(int i=n;i>=1;i--){
for(int j=v[i];j<=m;j++){
f[i][j]=f[i+1][j];
if(j>=v[i])f[i][j]=Math.max(f[i][j],f[i+1][j-v[i]]+w[i]);
}
}
//反推方案
int j=m;
for(int i=1;i<=n;i++){
if(j>=v[i]&&(f[i][j]==f[i+1][j-v[i]]+w[i])){
System.out.print(i+" ");
j-=v[i];
}
}
}
}