洛谷 P10483 小猫爬山 完整题解

[复制链接]
发表于 2024-12-15 21:32:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、题目检察

  P10483 小猫爬山 - 洛谷

    二、解题思绪

  我们将采取递归 + 剪枝的思想:
  sum数组存放每辆车当前载重。
  每次新考虑一只小猫时,我们实验把它放进每个可以放进的缆车中(需要回溯)
  1. for (int i = 0; i < k; i++) {
  2.         if (sum[i] + c[u] <= w) {
  3.                 sum[i] += c[u];
  4.                 dfs(u + 1, k);
  5.                 sum[i] -= c[u];
  6.         }
  7. }
复制代码
我们还要再实验为它单独新开一辆缆车,不然会错(也要回溯)
  1. sum[k] = c[u];
  2. dfs(u + 1, k + 1); // 再开一个缆车
  3. sum[k] = 0;
复制代码
最后我们需要更新答案和剪枝
  1. if (k >= ans) return; // 如果缆车数量不如当前最佳答案直接剪枝
  2. if (u == n) ans = k; // 小猫都装完了
复制代码

    三、代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 20;
  4. int c[N], sum[N];
  5. int n, w, ans;
  6. void dfs(int u, int k) { // u = 第 u 只小猫, k = 缆车数量
  7.         if (k >= ans) return; // 如果缆车数量不如当前最佳答案直接剪枝
  8.         if (u == n) ans = k; // 小猫都装完了
  9.         for (int i = 0; i < k; i++) {
  10.                 if (sum[i] + c[u] <= w) {
  11.                         sum[i] += c[u];
  12.                         dfs(u + 1, k);
  13.                         sum[i] -= c[u];
  14.                 }
  15.         }
  16.         sum[k] = c[u];
  17.         dfs(u + 1, k + 1); // 再开一个缆车
  18.         sum[k] = 0;
  19. }
  20. int main() {
  21.         cin >> n >> w;
  22.         ans = n;
  23.         for (int i = 0; i < n; i++) {
  24.                 cin >> c[i];
  25.         }
  26.         dfs(0, 0);
  27.         cout << ans;
  28.         return 0;
  29. }
复制代码
   四、测试结果

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表