这题别看了,跳过吧

有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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值