有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 说实话,当时第一次看到这个题时,第一感觉是三层for循环,感觉好简单,但是后来怎么做都是wa。 现在才想明白,题目中早就已经提示了:从正整数中选任意个数之和,任意是什么意思啊,不就是开始不知道吗,那怎么做啊,走一步看 一步呗,那就是搜索呗,另外是任意和,肯定是先一条路走到黑,深搜呗,思路想明白了,剩下的就明白了,啊啊啊啊,被水题坑惨了 ,还是先看代码吧#include<stdio.h> #include<string.h> #include<math.h> int ch[20]; int book[20]; int n,s; int ans; void dfs(int sum,int len) { if(sum>s){ ans++; } for(int i=len+1;i<n;i++) { if(book[i]==0) { book[i]=1; dfs(sum+ch[i],i); book[i]=0; } } } int main() { int t; scanf("%d",&t); while(t--) { ans=0; memset(ch,0,sizeof(ch)); memset(book,0,sizeof(book)); scanf("%d%d",&n,&s); for(int i=0;i<n;i++) { scanf("%d",&ch[i]); } for(int i=0;i<n;i++) { book[i]=1; dfs(ch[i],i); } printf("%d\n",ans); } }