动态规划-完全背包系列

完全背包与01背包的区别在于,01背包中所有物品要么选要不不选,完全背包是所有物品可以选任意次。完全背包与01背包很相似,可以将完全背包转换成01背包,也可以找到其状态转移方程。

1.完全背包
2.完全背包变形题-最小乘车费用
3.完全背包变形题-货币系统


1.完全背包

问题描述:有n件物品和一个容量为m的背包,每件物品都有无限件可用,第i件物品的体积为w[i],价值是v[i],求解将哪些物品放入背包可使这些物品的价值总和最大并且不超过背包容量。

说明:完全背包问题和01背包问题相似,可以将其改造成01背包问题。
方法一:改造状态转移方程:f(n,m) = max{k*v[i]+f(i-1,j-k*w[i])},其中k=0….j/w[i]
这样需要使用三层for循环,时间复杂度高,不推荐。

**方法二:**f(n,m) = max{f(n-1,m),f(n,m-w[n])+v[n]}

package com.zd.dp.complete;

import java.util.ArrayList;

/**
 * 完全背包问题
 * 有n个物品和容量为m的背包,每件物品有无限件,求最价值最大
 *
 */
public class Main{
   
   
    public static void main(String[] args){
        int n = 4;
        int[] weight = {
  
  2,3,4,7};
        int[] value = {
  
  1,3,5,9};
        int m = 10;
        int res = getMaxValue(n,weight,value,m);
        System.out.println(res);

        int res_01 = getMaxValue_01(n,weight,value,m);
        System.out.println(res_01);

        int res_01_new = getMaxValue_01_new(n,weight,value,m);
        System.out.println(res_01_new);
    }

    /**
     * 方法一:改造状态转移方程
     * @param n
     * @param weight
     * @param value
     * @param m
     * @return
     */
    private static int getMaxValue_01_new(int n, int[] weight, int[] value, int m) {
        if (n == 0 || m == 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值