背包问题——完全背包

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdays83892469/article/details/79766178

完全背包

我们扩展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

猜你喜欢

转载自blog.csdn.net/wdays83892469/article/details/79766178