题目
AC代码和理解:
package 算法模板;
import java.util.*;
/*
* f[i]表示总体积是i的情况下,最大价值是多少
* result = max{f[0.....m]}
* for(int i=0;i<n;i++){
* for(int j=v[i];j<=m;j++){
* f[j]=max(f[j],f[j-v[i]]+w[i])
* }
* }
* 数学归纳法:
* 1、假设考虑前i-1之后,所有的f[i]都是正确的
* 2、来证明:考虑完第i个物品后,所有的f[i]也都是正确的
*
* 对于某个j而言,如果最优解中包含k个v[i]
*
* f[j-k*v[i]];
* f[j-(k-1)*v[i]-v[i]]+w[i]]包含1个v[i]
* .....
* f[j]f[j-v[i]]+w[i]
*/
public class 完全背包 {
static int N=1010;
static int n,m;
static int f[]=new int [N];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
for(int i=0;i<n;i++) {
int v=sc.nextInt();
int w=sc.nextInt();
for(int j=v;j<=m;j++) {
f[j]=Math.max(f[j],f[j-v]+w);
}
}
System.out.println(f[m]);
}
}