背包问题

前言:第一次接触状态转移方程,鸡冻!

目录

问题:

假设山洞里共有a,b,c,d,e这5件宝物(不是5种宝物),它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包,
怎么装背包,可以才能带走最多的财富

算法原理

状态转移方程 dp[i,j]=max{dp[i-1,j-wi],dp[i-1,j]}
dp[i,j] 把前i件物品 放在承重为j的包中 最大获益值
dp[i-1,j-wi] 把前i-1件物品 放在承重为j-wi的包中 最大获益值+Vi(考虑本件物品已经被放进来了,所以减去)
dp[i-1,j] 把前i-1件物品 放在承重为j的包中 最大获益值(考虑,不放进本件物品,放进其他物品,或者是什么也不再放)

这里写图片描述

代码:(暂时有点小问题)

public class backpack {
int m=4;

/*A:weight 数组
// V:value 这里V=weight
   m是包的承重量

 */
 public  void  bp(int[] W,int[] V,int n,int m)
    {

        int[][] dp = new int[n][m+1];
        for (int j = 0; j < m+1; j++) {
        for (int i = n-1; i >0; i--) {
                if (j >= W[i]) {
                    dp[i][j] = Math.max(dp[i-1][j - W[i]] + V[i], dp[i- 1][j]);
                }
            }
        }


//输出
        for(int k=0;k<n;k++) {
            for (int kk = 0; kk < m; kk++) {
                System.out.printf("%4d", dp[k][kk]);

            }
            System.out.println("");
        }

    }



    public static void main(String[] args) {

     int []V={7,5,3,2};
     int W[]={7,5,3,2};
     int m=11;
     int n=4;
     backpack a=new backpack();
     a.bp(W,V,n,m);




    }

}

参考文献

https://blog.csdn.net/mu399/article/details/7722810
https://blog.csdn.net/Thousa_Ho/article/details/78156678

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值