首页 > 其他分享 >[AcWing 165] 小猫爬山

[AcWing 165] 小猫爬山

时间:2022-08-17 22:22:38浏览次数:68  
标签:剪枝 小猫 int sum dfs ans 165 AcWing

image
image

DFS 剪枝


点击查看代码
#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N = 50 + 10;

int n, m;
int w[N];
int sum[N]; // 每组的重量之和
int ans = 1e9;

// 当前枚举到w[u] 分了k组
void dfs(int u, int k)
{
    // 递归边界 和 最优性剪枝
    if (u == n || k >= ans) {
        ans = min(ans, k);
        return;
    }
    // 放到现有的组中
    for (int i = 0; i < k; i ++)
        // 可行性剪枝
        if (sum[i] + w[u] <= m) {
            sum[i] += w[u];
            dfs(u + 1, k);
            sum[i] -= w[u];
        }
    // 新开一组
    sum[k] = w[u];
    dfs(u + 1, k + 1);
    sum[k] = 0;
}

void solve()
{
    cin >> n >> m;
    for (int i = 0; i < n; i ++)
        cin >> w[i];
    sort(w, w + n, greater<int>());
    dfs(0, 0);
    cout << ans << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    solve();

    return 0;
}

  1. 将猫的重量从小到大排序,从小到大的原因是保证树的分支越往下越少,用 \(DFS\) 从前往后枚举每个猫分到哪个组:
    ① 放到前面的组,要保证组内的总重量小于要求的重量
    ② 新开一组放进去

标签:剪枝,小猫,int,sum,dfs,ans,165,AcWing
From: https://www.cnblogs.com/wKingYu/p/16596996.html

相关文章

  • acwing2022秋招每日一题 1302. 层数最深叶子节点的和
    题目给你一棵二叉树的根节点 root ,请你返回 层数最深的叶子节点的和 。思路根据层序遍历,访问所有节点。将每一层上的结点,进行统计,直到最后一层时,统计所有节点数。......
  • [AcWing 1118] 分成互质组
    DFS点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=50+10;intn;inta[N];intlen,ans=1e9;vector<i......
  • [AcWing 1117] 单词接龙
    DFS点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=50+10;intn;stringword[N];intg[N][N];//g[i][......
  • [AcWing 258] 石头剪刀布
    带扩展域的并查集点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10;intn,m;intp[N];structN......
  • [AcWing 145] 超市
    贪心+小根堆点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;constintN=1e6+10;intn;......
  • 洛谷 P1654 OSU!
    思路考虑\(DP\)转移,设\(F[i]\)表示长度为\(i\)序列的期望分数。得到如下转移:\(F[i]=(F[i-1]-A[i-1]+A[i])p_i+F[i-1](1-p_i)\)其中\(A[i]\)的意义是:以\(i\)......
  • AcWing周赛62-64 中比较有意思的小题题解
    AcWing周赛62-64(选讲)感觉比较思维4502.集合操作https://www.acwing.com/problem/content/4505/根据题意,肯定要使得所取的最大值最大,平均值最小。又因为每次放进来的的......
  • [AcWing 4507] 子数组异或和
    异或的性质点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=1e6+10;intn;inta[N];voidsolve(){......
  • AcWing3293.统计单词
    原题链接string.back()、string.pop_back()妙用#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;intmain(){stringstr;......
  • Acwing 第 64 场周赛 C 4507. 子数组异或和(异或+前缀和)
    https://www.acwing.com/problem/content/4510/给定一个长度为n的整数数组a1,a2,…,an。请你统计一共有多少个数组a的非空连续子数组能够同时满足以下所有条件:该......