3.完全背包(不限个数)

/**
 * FileName: Main
 * Author:   Jerry
 * Date:     2020/1/27 20:54
 * Description: 完全背包
 */
 
public class Main {
    /*
    * @ V 背包容积
    * @ N 商品种类
    * @ int []value 商品价值
    * @ int []weight 商品重量
    * */
    public static void completePack(int V,int N,int[] weight,int []value)
    {
        int [][] dp =new int[N+1][V+1];
        int temp;
        int [] t =new int[N+1];
        //初始化动态规划数组
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=V;j++)
            {
                if(j>=weight[i])
                {
                    int max = j/weight[i];
                    for(int k=0;k<=max;k++)
                    {
                        temp=Math.max(dp[i-1][j],dp[i-1][j-k*weight[i]]+k*value[i]);
                        if(dp[i][j]<temp)
                            t[i]=k;
                        dp[i][j]=Math.max(dp[i][j],temp);
                    }
                }
                else
                    dp[i][j]=dp[i-1][j];
            }
        }
        int maxValue = dp[N][V];
        System.out.println("最大价值为"+maxValue);
        int j =V;
        String numStr = "";
        for(int i=N;i>=1;i--)
        {
            if(dp[i][j]>dp[i-1][j])
            {
                numStr=numStr+"商品种类"+i+"该商品共"+t[i]+"件   ";
                j=j-weight[i];
            }
            if(j==0)
                break;
        }
        System.out.println(numStr);
 
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] weight= {0,1,2,3};
        int[] value= {0,6,13,20};
        int bagV=15;
        int N=3;
        completePack(bagV,N,weight,value);
 
    }
}

  

原文地址:https://www.cnblogs.com/AccompanyingLight/p/12269363.html