完全背包
我们扩展01背包问题,使每种物品无限增加,便得到完全背包问题,
01背包问题
有一个容积为V的背包,同时有n个物品,每个物品有自己的体积w和价值v,
每个物品的数量均为无限个,求使用该背包最多能装的物品价值总和。
使用空间优化过的一维数组按照这种方式扩展
01背包之所以使用逆序循环,保证更新dp[j]的时候dp[j-W[i]]是没有放入物品i时的数据dp[i-1][j-W[i]]
这是因为01背包中每个物品至多只能被选择一次。
而在完全背包中每个物品可以被无限次选择,那么状态dp[i][j]恰好可以由可能已经放入物品i的状态dp[i-1][j-W[i]]转移而来
,固在这里将遍历顺序改为顺序,使在更新状态dp[j]的时候,dp[j-W[i]]时可能因为放入物品i而发生改变,从而得到目的
简单讲就是把01背包从逆序改成顺序就是完全背包
01背包的进阶
//input
3 10
5 3
9 2
4 7
//output
14 原答案是10
import java.util.Scanner;
public class completeBag {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int dp[]=new int[13000];
int W[]=new int[3405];
int D[]=new int[3405];
int n=input.nextInt();
int m=input.nextInt();
for (int i = 1; i <= n; i++) {
W[i]=input.nextInt();
D[i]=input.nextInt();
}
// for (int i = 1; i <=n; i++) {//01bag
// for (int j = m; j >= W[i]; j--) {
// dp[j]=Math.max(dp[j], dp[j - W[i]] + D[i]);
// }
// }
for (int i = 1; i <=n; i++) {
for (int j = W[i]; j <=m ; j++) {
dp[j]=Math.max(dp[j], dp[j - W[i]] + D[i]);
}
}
System.out.println(dp[m]);
}
}
同类型题目
Piggy-Bank
http://acm.hdu.edu.cn/showproblem.php?pid=1114
买书
https://blog.csdn.net/wdays83892469/article/details/79732393