有n个正整数,求从这n个正整数里选任意个数之后加和大于S有多少种选法
第一行输入测试用例的个数T(0<t<=10)。
对于每一个测试用例输入两行,第一行两个正整数,第一个数n(0<n<=10)代表n个正整数,第二个数S(0<S<1000)
第二行输入n个正整数a1...an(0<ai<100)
每个测试用例输出一个数,代表从这n个正整数里选任意个数之后加和大于S的选法
1 4 8 1 2 3 4
2
没错,这道题我一看就是用深度优先搜索,以下是我的代码,这是个有问题的代码,输入样例的话是对的,但一旦输入如1 2 3 4 5和8的时候,
程序运行到1+2+3+4的时候发现比8大,于是就返回了,就不再执行+5的操作 ,我改了很久也没改出来,最后问了宿舍的大佬
#include<stdio.h>
#include<string.h>
int n,s;
int array[11]={0},book[11]={0};
int count,sum;
void dfs(int step);
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&s);
for(int i=0;i<n;i++){
scanf("%d",&array[i]);
}
for(int i=0;i<n;i++){
sum=0;
dfs(i);
}
printf("%d\n",count);
}
}
void dfs(int step){
if(sum>s){
count++;
return;
}
else{
for(int i=step;i<n;){
if(book[i]==0){
book[i]=1;
sum+=array[i];
dfs(step+1);
book[i]=0;
return;
}
}
}
}
宿舍大佬给我改的代码
#include<stdio.h>
#include<string.h>
int n,s;
int array[11]={0},book[11]={0};
int count,sum;
void dfs(int step);
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&s);
count=0;
for(int i=0;i<n;i++){
scanf("%d",&array[i]);
}
for(int i=0;i<n;i++){
sum=array[i];
dfs(i);
}
printf("%d\n",count);
}
}
void dfs(int step){
if(sum>s){
count++;
}
for(int i=step+1;i<n;i++){
if(book[i]==0){
book[i]=1;
sum+=array[i];
dfs(i);
sum-=array[i];
book[i]=0;
}
}
}
大佬就是大佬......