自学动态规划——最后一块石头的重量 II

最后一块石头的重量 II

1049. 最后一块石头的重量 II - 力扣(LeetCode)

也是三刷,能无阻力做出来,但是发现做的效果没有之前好了,可以学学之前做的时候是如何优化的。

AC:

int lastStoneWeightII(vector<int>& stones)
{
    //也是分为两组,要让这两组的差值最小即可
    //看做是背包,均分数值,即最大容量是 sum/2,然后选取来装,让其尽可能装满,最后用总量来减就是另一个背包的重量,将两者相减就是答案
    int sum=0;
    for(int i=0;i<stones.size();i++)    sum+=stones[i];
    int total=sum/2;
    vector<int>dp(total+1,0);
    for(int i=0;i<stones.size();i++)
    for(int j=total;j>=stones[i];j--)
        dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);
    return abs((sum-dp[total])-dp[total]);
}

Faster:

优化方法是,多加了一个判断,如果恰好已经是一半了,那就直接返回就好,不需要再算剩下的了,因为此时已经是最好的安排了。

int lastStoneWeightII(vector<int>& stones)
{
	int dp[3002] = { 0 };

	int sum = 0;
	for (int s : stones)	sum += s;

	int maxsize = sum / 2;
	dp[0] = 0;
	for(int i=0;i<stones.size();i++)
		for (int j = maxsize; j >= stones[i]; j--)
		{
			if (dp[j] < maxsize)
				dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);
			else if (2*dp[j] == sum)	return 0;
			//如果大于,那就顺延,不变
		}
	return sum - 2 * dp[maxsize];
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值