Leecode-跳跃游戏-贪心算法、动态规划

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。

在这里插入图片描述
贪心:
在这里插入图片描述

class Solution {
public:
    int jump(vector<int>& nums) {
        int maxPos = 0, n = nums.size(), end = 0, step = 0;
        for (int i = 0; i < n - 1; ++i) {
            if (maxPos >= i) {   //maxPos为可走范围,只要i在可走范围内,就不停用最远值(maxPos)更新
                maxPos = max(maxPos, i + nums[i]);
                if (i == end) {
                    end = maxPos;  //end为每轮找定最大值后的边界
                    ++step;
                }
            }
        }
        return step;
    }
};

动态规划:
在这里插入图片描述

class Solution {
public:
    int jump(vector<int>& nums) {

    vector<int> value;
    vector<int> max;
    for(int i=0;i<nums.size();i++){
    	// value[i]=1;
        max.push_back(i+nums[i]);
        if(i==0) value.push_back(0);
        else value.push_back(999999);
	}
	for(int i=0;i<nums.size();i++){  //i每次与它前面的每个j比较大小
		for(int j=0;j<i;j++){
			if(i<=max[j]) value[i]=min(value[i],value[j]+1); //若比前面的某个数大,将value[j]+1与自己value[i]对比留大
		}
	}
	return value[nums.size()-1];

    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
0-1背包问题是一个经典的优化问题,在给定一组物品、每种物品都有自己的重量和价值,在限定的总重量内,选择其中若干个物品装入背包,使得背包中物品的总价值最大。这个问题可以用贪心算法来求解。 贪心算法的思路是每次选取当前最优的物品放入背包,直到无法再放入为止。具体实现可以按照物品的单位价值(即每单位重量的价值)从大到小排序,先选取单位价值最大的物品放入背包,如果放不下再选取次大的物品,以此类推,直到无法再放入为止。 下面是一个简单的实现示例: ```python def knapsack(capacity, weights, values): n = len(weights) unit_values = [(values[i] / weights[i], i) for i in range(n)] unit_values.sort(reverse=True) selected_items = [0] * n total_value = 0 for unit_value, i in unit_values: if weights[i] <= capacity: selected_items[i] = 1 capacity -= weights[i] total_value += values[i] else: selected_items[i] = capacity / weights[i] total_value += unit_value * capacity break return total_value, selected_items ``` 其中,`capacity` 表示背包的总容量,`weights` 和 `values` 分别表示物品的重量和价值,`unit_values` 是按单位价值从大到小排序的物品列表,`selected_items` 表示选中的物品,其中 `1` 表示选中,`0` 表示未选中。函数返回总价值和选中的物品列表。 上述实现中,我们采用了 Python 中的元组比较的特性,即先按照第一个元素比较,相同则按照第二个元素比较。这样就可以实现按照单位价值从大到小排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值