完全背包与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 ==