package 算法模板;
import java.util.Scanner;
public class 零一背包模板题目 {
//链接:https://www.acwing.com/problem/content/2/
static int n,m,N=3500;
static int[][] f=new int [N][N];
static int a[]=new int [N];
static int v[]=new int [N],w[]=new int [N];
public static void main(String[] args) {
show1();
}
/*
* f[0]=0
* f[i]=0
* k<m
* f[k]=max_w
* f[0]=0=>f[v[0]]=w[0]=>……
* f[m-k]=0=>f[m-k+v[0]]=w[0]=>……
*/
public static void show1() {
Scanner sc=new Scanner (System.in);
n=sc.nextInt();
m=sc.nextInt();
for(int i=1;i<=n;i++) {
v[i]=sc.nextInt();
w[i]=sc.nextInt();
}
for(int i=1;i<=n;i++) {
for(int j=m;j>=v[i];j--) {
a[j]=Math.max(a[j],(a[j-v[i]]+w[i]));
}
}
System.out.println(a[m]);
}
/*
* f[i][j]表示只看前i个物品总体积为j总价值最大为多少
* ans=max{f[n][0~v]}
* f[i][j]==???
* 1、不选第i个物品f[i][j]=f[i-1][j]
* 2、选第i个物品f[i][j]=f[i-1][j-v[i]]
*/
public static void show() {
Scanner sc=new Scanner (System.in);
n=sc.nextInt();
m=sc.nextInt();
for(int i=1;i<=n;i++) {
v[i]=sc.nextInt();
w[i]=sc.nextInt();
}
for(int i=1;i<=n;i++) {
for(int j=1;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 res=0;
for(int i=0;i<=m;i++)res=Math.max(res,f[n][i]);
System.out.println(res);
}
}
01背包模板题目
最新推荐文章于 2024-03-26 20:26:43 发布