C++ dfs的状态表示(五十二)【第十二篇】

news/2024/7/20 20:56:46 标签: 深度优先, 算法

今天是对于之前的问题改进

1.k个数求和

对于前面 k 个数的和的求法,我们除了可以用上面的 DFS 方法以后,还有一种搜索策略。

之前的方法是每次去抉择是否选择第 
i 个数,现在我们的策略是从剩下的数中选择一个数。比如有 
5 个数 1,2,3,4,5,如果选择了 
1,那么剩下 2,3,4,5 四个数;如果选择了 2,那么剩下 1,3,4,5 四个数,还可以选择 3....;选择 
4....;选择 5.....。

代码实现起来很简单,我们标记每个数的是否被选择了。我们用 s 表示选出来的数的和,cnt 表示选出来的数的个数。

int n, k, sum, ans = 0, a[110];
bool xuan[110]; // 标记是否选择了
void dfs(int s, int cnt) {
    if (cnt == k) {
        if (s == sum) {
            ans++;
        }
    }
    for (int i = 0; i < n; i++) {
        if (!xuan[i]) {
            xuan[i] = true;
            dfs(s + a[i], cnt + 1);
            xuan[i] = false;
        }
    }
}

去除重复的方案

如果 int a[5] = {1, 2, 3, 4, 5}; 当 k=6 时,根据我们的方法可以获得:1 2 3

1 3 2
2 1 3
2 3 1
3 1 2
3 2 1


6 种选择方案,但是它们本质上是一种 1 + 2 + 3,所以可以尝试去除重复的方案。

仔细观察可以发现,它找出的 66 种方案实际上是 1, 2, 3 的全排列,而 n 个数进行全排列时,方案数有 n!=1×2×⋯×n 种。

所以 dfs 计算出来的方案数 ans 还需要除以 n!。


http://www.niftyadmin.cn/n/5374801.html

相关文章

「优选算法刷题」:搜索插入位置

一、题目 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例…

牛客周赛 Round 32 F.小红的矩阵修改【三进制状态压缩dp】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/75174/F 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小红拿到了一个字符矩阵&#xff0c;矩阵中仅包含&q…

tcp 中使用的定时器

定时器的使用场景主要有两种。 &#xff08;1&#xff09;周期性任务 这是定时器最常用的一种场景&#xff0c;比如 tcp 中的 keepalive 定时器&#xff0c;起到 tcp 连接的两端保活的作用&#xff0c;周期性发送数据包&#xff0c;如果对端回复报文&#xff0c;说明对端还活着…

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征

【北邮鲁鹏老师计算机视觉课程笔记】06 corner 局部特征 1 局部特征的任务牵引&#xff1a;全景拼接 ①提取特征 ②匹配特征 ③拼接图像 我们希望特征有什么特性&#xff1f; ①可重复性 ②显著性 ③计算效率和表达紧凑性 ④局部性 2 特征点检测的任务 3 角点 在角点&#…

金明的预算方案 ——分组背包

金明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间金明自己专用的很宽敞的房间。 更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间需要购买哪些物品&#xff0c;怎么布置&#xff0c;你说了算&#xff0c;只要不超过N元钱就行”…

RK3588平台开发系列讲解(视频篇)RKMedia 数据流向

文章目录 一、 获取RKMedia模块通道中的数据二、RKMedia的数据源和接收者三、模块通道绑定API调用 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;RKMedia是RK提供的一种多媒体处理方案&#xff0c;可实现音视频捕获、音视频输…

Stream Query Denoising for Vectorized HD Map Construction

参考代码&#xff1a;截止2024.02未开源 动机与出发点 这篇文章是在StreamMapNet的基础上做的&#xff0c;为了在局部地图感知任务上提升时序上的感知稳定性&#xff0c;参考DN-DETR中的去噪方案&#xff0c;为局部地图感知提出一种针对局部地图元素的加噪声方案以及去噪逻辑。…

C# Thread的使用

在C#中&#xff0c;线程用于实现程序的并发执行。通过创建和管理多个线程&#xff0c;可以同时处理不同的任务或操作&#xff0c;从而提高程序性能和响应性。以下是如何在C#中使用线程的基本步骤&#xff1a; 创建新线程 // 使用System.Threading命名空间 using System.Threa…