选题(dfs)

#include <bits/stdc++.h>
using namespace std;

int n, l, r, x;
int a[20];
int ans = 0;

void dfs(int id,int sum,int minv,int maxv,map<int,int>& m) {
    if (m.size() >= 3 && sum >= l && sum <= r && maxv - minv >= x) ans++;

    for (int i = id; i < n; ++i) {
        m[a[i]]++;
        dfs(i + 1,sum + a[i],min(minv, a[i]),max(maxv, a[i]),m);
        m[a[i]]--; // 回溯
        if (m[a[i]] == 0) m.erase(a[i]); // 清除 0 值键
    }
}

int main() {
    cin >> n >> l >> r >> x;
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    map<int, int> m;
    dfs(0, 0,INT_MAX, INT_MIN, m);
    cout << ans << endl;
    return 0;
}

 

注意到“3种”,可以用map来存储,判断m.size()种类 >=3 ,

还有回溯时为零的数erase删除

  • id:当前处理到第几道题。

  • sum:当前已选题的难度总和。

  • minvmaxv:当前选题中的最小和最大难度。

  • m:统计当前选择中不同难度题目的个数。

如果当前组合符合所有条件,就把答案加 1。

### 数据结构综合实验设计选题示例 #### 实验一:高效图遍历算法及其应用 此实验旨在探讨并实现高效的图遍历方法,如广度优先搜索(BFS)和深度优先搜索(DFS)。通过对比两种算法的时间复杂度以及空间消耗情况,在实际应用场景下评估其性能差异。为了增加项目的难度与挑战性,还可以引入启发式搜索策略来优化路径查找过程[^1]。 ```python from collections import deque def bfs(graph, start_node): visited = set() queue = deque([start_node]) while queue: node = queue.popleft() if node not in visited: print(node) visited.add(node) for neighbor in graph[node]: if neighbor not in visited: queue.append(neighbor) # 使用样例 graph_example = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': [], 'D': [], 'E': [] } bfs(graph_example, 'A') ``` #### 实验二:动态规划求解背包问题 本课题聚焦于经典组合最优化难题——0/1 背包问题的研究。通过对物品价值、重量等属性建模分析,采用自底向上的方式逐步构建最优子结构性质;进而利用记忆化技术减少重复计算次数,最终得到全局最佳方案。此外,可尝试扩展至多维约束条件下的变种版本,进一步提升题目难度[^2]。 ```python def knapsack(weights, values, capacity): n = len(values) dp = [[0]*(capacity+1) for _ in range(n+1)] for i in range(1,n+1): for w in range(capacity+1): if weights[i-1]<=w: dp[i][w]=max(dp[i-1][w],values[i-1]+dp[i-1][w-weights[i-1]]) else: dp[i][w]=dp[i-1][w] return dp[-1][-1] # 测试用例 print(knapsack([1, 3, 4, 5],[1, 4, 5, 7],7)) ``` #### 实验三:平衡树的数据维护机制探究 红黑树作为一种重要的自调整二叉查找树结构,在保持高度平衡的同时支持快速插入删除操作。该专题将深入剖析红黑树内部运作原理,并亲手编写一套完整的增删改查接口函数库。在此基础上,鼓励学生自行探索其他类型的平衡树(例如AVL Tree),比较它们之间存在的异同之处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值