1 条题解
-
0
解题思路 本题 n≤20,子集总数为 2^20,可以暴力枚举所有子集: 对于每个数字,只有两种选择:选 或 不选;
这里提供两种写法,第一种最后再计算总和 第二种传参tot 最后直接判断
#include<bits/stdc++.h> using namespace std; #define int long long int n,x,ans; int a[25],vis[25]; // DFS枚举第i个数字选或不选 void dfs(int i){ // 递归边界:已经枚举完所有n个数字 if(i==n+1){ int res=0; // 计算当前选中的数字的和 for(int i=1;i<=n;i++){ if(vis[i]==1)res+=a[i]; } // 如果和小于x,答案+1 if(res<x)ans++; return ; } // 不选第i个数字 vis[i]=0; dfs(i+1); // 选第i个数字 vis[i]=1; dfs(i+1); } signed main(){ cin>>n>>x; for(int i=1;i<=n;i++){ cin>>a[i]; } // 从第一个数字开始DFS dfs(1); cout<<ans; }
信息
- ID
- 832
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 24
- 已通过
- 10
- 上传者