背包问题——(多重背包)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/**
 * FileName: Main
 * Author:   Jerry
 * Date:     2020/1/27 19:58
 * Description: 多重背包
 */
  
public class Main {
    /*
    *int []num 每种商品的最大售卖数
    * V 背包最大容积
    * N 商品种类数
    * */
    public static void multiplePack(int V,int N,int []weight,int []value,int []num)
    {
        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 = Math.min(num[i],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[] num= {0,5,3,2};
        int bagV=15;
        int N=3;
        multiplePack(bagV,N,weight,value,num);
  
    }
  
  
}

  

 

2、多重背包:每类物品都有个数限制,第i类物品最多可以装num[i]

由于每个物品多了数目限制,因此初始化和递推公式都需要更改一下。初始化时,只考虑一件物品a时,最大可提供量 max = min{num[1], j/weight[1]}。 计算考虑i件物品承重限制为y时最大价值f[i][j]时,递推公式考虑两种情况,要么第 i 件物品一件也不放,就是dp[i-1][j], 要么第 i 件物品放 k 件,其中 0<= k <=Math.min(num[i],j/weight[i])

f[i][j] = max{f[i-1][j], (f[i-1][j-kweight[i]]+kvalue[i])}。 需要判断第 i 件物品的个数是否超过限制数量 num[i]




如果你觉得博客内容有帮助,请收藏书签。
版权声明:转载文章之后必须在文章页面给出原文连接创意共享3.0许可证
posted @   longRookie  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
最简单即最美
有了信仰,自己要坚持努力 2017.07.09 21:34


点击右上角即可分享
微信分享提示