回收废品,每次选两个来切碎,分别是m和n且m<=n, 当m==n时 ,两个都切碎(即数组直接少了m和n),如果m<n,则m切碎,n=n-m ,切到最后 剩余一个废品则返回废品大小,若剩0个则返回0

描述:

回收废品,每次选两个来切碎,分别是m和n且m<=n, 当m==n时 ,两个都切碎(即数组直接少了m和n),如果m<n,则m切碎,n=n-m ,切到最后 剩余一个废品则返回废品大小,若剩0个则返回0

这题就是力扣的最后一块石头的重量

示例:

 输入:stones = [2,7,4,1,8,1]
输出:1
解释:
组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],
组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],
组合 2 和 1,得到 1,所以数组转化为 [1,1,1],
组合 1 和 1,得到 0,所以数组转化为 [1],这就是最优值

代码: 

class Solution {

    public int lastStoneWeightII(int[] stones) {

        int len=stones.length;

        int sum=0;

        for(int i=0;i<len;i++){

            sum+=stones[i];

        }

        int targer=sum/2;

        //dp[i]:容量为i时,放入物品的最大价值

        int[] dp=new int[targer+1];

        for(int i=0;i<len;i++){

            for(int j=targer;j>=stones[i];j--){

                dp[j]=Math.max(dp[j],dp[j-stones[i]]+stones[i]);

            }

        }

        return sum-dp[targer]-dp[targer];

    }

}


版权声明:本文为w20001118原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。