深搜正解
2026-06-21 10:20:25
发布于:北京
1阅读
0回复
0点赞
每一次输入一个数,我们可以选择加上它,或不加上它,这就是一个深搜了,深搜里需要储存三个数1.现在遍历到了第几个数,2.现在的和是多少,3.现在选了几个数
void dfs(int id , int sum , int num) {
}
首先要初始化ans
if(id == 1 && ans) ans = 0 ;
若遍历完了,或选够m个数了,就判断,这里需要注意当遍历完时,不一定选够m个数,所以要特判
然后建一个桶,别忘了在T组输入时初始化
if(num == m || id == n + 1) {
if(num < m) return ;
if(b[sum]) return ;
ans++;
b[sum] = 1;
return ;
}
最后处理选还是不选
dfs(id + 1 , sum + a[id] , num + 1);
dfs(id + 1 , sum , num) ;
深搜就完成了,写上T组输入,搞定,完整代码来了
#include <bits/stdc++.h>
using namespace std ;
const int N = 1e4;
const int NN = 1e7 + 10;
int a[N];
bool b[NN];
int n , m , op = 0;
int ans = 0 ;
void dfs(int id , int sum , int num) {
if(id == 1 && ans) ans = 0 ;
if(num == m || id == n + 1) {
if(num < m) return ;
if(b[sum]) return ;
ans++;
b[sum] = 1;
return ;
}
dfs(id + 1 , sum + a[id] , num + 1);
dfs(id + 1 , sum , num) ;
return ;
}
void solve() {
cin >> n >> m ;
op = 0 ;
for(int i = 1 ; i <= NN ;i++) b[i] = 0;
for(int i = 1 ; i <= n ; i++) cin >> a[i] ;
dfs(1, 0 , 0);
cout << ans << endl;
return ;
}
int main () {
int T ;
cin >> T ;
while(T--) solve() ;
return 0 ;
}
这里空空如也




有帮助,赞一个