救一下,TLE
  • 板块题目总版
  • 楼主wuyuyaostxq
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/20 15:05
  • 上次更新2024/10/20 17:02:18
查看原帖
救一下,TLE
1239529
wuyuyaostxq楼主2024/10/20 15:05

小 X 和小 Y 分居两地了好长一段时间,小 Y 非常想念小 X。过几天小 Y 就能回来了,他想在当地的商店给小 X 购买一些纪念品,但是很不幸的是,小 Y 是一个穷鬼,他走到商店的橱窗前只觉得自己囊中羞涩,不能将展台上的东西各买一样。橱窗的展台上排列的 n 个不同的纪念品,第 i 个纪念品的价格为 p i

,小 Y 手中的钱只有 M,他想问问你,他总共有多少种不同的方案来购买这些纪念品?

注意,小 Y 可以选择不把所有钱都花完。

输入格式 输入包含两行。第一行给出正整数

n,m。第二行给出

n 个正整数 p i ​ ,表示每个纪念品的价格。

输出格式 输出一行,表示方案的个数。注意:答案 ≤ 2^40

#include <iostream>  
#include <vector>  
  
using namespace std;  
  
typedef unsigned long long ull;  
  
// 全局变量来存储结果和当前的总和  
ull result = 0;  
int currentSum = 0;  
  
// DFS 函数  
void dfs(const vector<int>& prices, int index, int m) {  
    // 如果当前索引超出了价格数组的长度,说明已经遍历完所有商品  
    if (index == prices.size()) {  
        // 如果当前总和不超过 m,则这是一种有效的购买方案  
        if (currentSum <= m) {  
            result++;  
        }  
        return;  
    }  
      
    // 不选择当前商品,继续搜索  
    dfs(prices, index + 1, m);  
      
    // 选择当前商品,并更新当前总和,然后继续搜索  
    if (currentSum + prices[index] <= m) {  
        currentSum += prices[index];  
        dfs(prices, index + 1, m);  
        currentSum -= prices[index]; // 回溯,撤销选择  
    }  
}  
  
int main() {  
  ios::sync_with_stdio(0);
  cin.tie(0);
    int n, m;  
    cin >> n >> m;  
      
    vector<int> prices(n);  
    for (int i = 0; i < n; ++i) {  
        cin >> prices[i];  
    }  
      
    // 调用 DFS 函数从第 0 个商品开始搜索  
    dfs(prices, 0, m);  
      
    // 输出结果  
    cout << result << endl;  
      
    return 0;  
}
//逆天马蜂见谅
2024/10/20 15:05
加载中...