完全背包:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大,没见物品可以使用无限次。
一维dp:
f[j]:考虑所有物品,背包容量为j时的最大价值
import java.util.*;
public class Main{
static int N = 1010;
static int n,m;
static int[] f = new int[N];
static int[] v = new int[N];
static int[] w = new int[N];
public static void main(String[] args){
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 = v[i];j<=m;j++)
//从小到大遍历背包容量
f[j] = Math.max(f[j],f[j-v[i]]+w[i]);
System.out.println(f[m]);
}
}
分析:
for(int i = 1;i<=n;i++)
for(int j = v[i];j<=m;j++)
//从小到大遍历背包容量
f[j] = Math.max(f[j],f[j-v[i]]+w[i]);
/*
这点与01背包完全相反,因为完全背包每个物品的数量无限个,相当于你可以放任意多个某件
物品,那当我们计算f[j]的时候,使用的就是第i层即本层的f[j-v[i]]来更新,
f[j-v[i]]+w[i]表示装入一件第i件物品,当我们枚举到更大容量时,还是会用本层的i来更新,
相当于还要计算是否还能装入一件第i件物品,那与我们暴力枚举每个物品的数量本质相同。
*/
}