动态规划


拿走最有价值的物品

背包可装 3kg,商品有 3 件

音响笔记本电脑吉他
3000 元2000 元1500 元
4 kg3 kg1 kg

将问题分成一个个网格

商品/重量1kg2kg3kg4kg
吉他
音响
笔记本电脑
商品/重量1kg2kg3kg4kg
吉他¥1500¥1500¥1500¥1500
音响
笔记本电脑
商品/重量1kg2kg3kg4kg
吉他¥1500¥1500¥1500¥1500
音响¥1500¥1500¥1500¥3000
笔记本电脑
商品/重量1kg2kg3kg4kg
吉他¥1500¥1500¥1500¥1500
音响¥1500¥1500¥1500¥3000
笔记本电脑¥1500¥1500¥2000¥3500

发现第四件商品 iPhone

音响笔记本电脑吉他iphone
3000 元2000 元1500 元2000 元
4 kg3 kg1 kg1kg
商品/重量1kg2kg3kg4kg
吉他¥1500¥1500¥1500¥1500
音响¥1500¥1500¥1500¥3000
笔记本电脑¥1500¥1500¥2000¥3500
iphone¥2000¥3500¥3500¥4000

K 站中转内最便宜的航班

来源:https://leetcode.cn/problems/cheapest-flights-within-k-stops/open in new window

有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。

现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。

输入:
n 三个城市 0->1 100 元,1 -> 2 100 元 , 0 -> 2 500 元
n = 3, edges = [[0,1,100],[1,2,100],[0,2,500]]
src 出发城市 dst 目的地 k 经过一站
src = 0, dst = 2, k = 1
输出: 200

//来源  https://leetcode.cn/problems/cheapest-flights-within-k-stops/solutions/954402/k-zhan-zhong-zhuan-nei-zui-bian-yi-de-ha-abzi/

var findCheapestPrice = function (n, flights, src, dst, k) {
  const INF = 10000 * 101 + 1;

  /*     1   2   3   航班
     1  花费
     2
     3
     城市
  */
  // 最多达成k+1次航班 =》 生成 k+2的数组
  // n 个城市
  // f => 一个二维数组 城市和航班次数
  const f = new Array(k + 2).fill(0).map(() => new Array(n).fill(INF));
  //0城市 话费为0 
  f[0][src] = 0;
  for (let t = 1; t <= k + 1; ++t) {
    for (const flight of flights) {
      const j = flight[0],
        i = flight[1],
        cost = flight[2];
        // t 航班 i 城市 =  话费
      f[t][i] = Math.min(f[t][i], f[t - 1][j] + cost);
    }
  }
  let ans = INF;
  // 遍历航班次数 筛选最小话费
  for (let t = 1; t <= k + 1; ++t) {
    ans = Math.min(ans, f[t][dst]);
  }
  return ans == INF ? -1 : ans;
};
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.13.0