dfs--选数

题目描述

给定n个正数,ZJM可以精确地选择其中的K个使它们之和为S。现在ZJM想知道有多少种方法可以得到它!

Input

第一行是一个整数T<=100,表示测试用例的数量。对于每种情况,有两行。第一行,三个整数分别表示n, K和S。第二行,n个正整数。

Output

对于每种情况,一个整数在独立的行中表示答案。

Example

Input:
1
10 3 10
1 2 3 4 5 6 7 8 9 10
Output:
4

Note

记住,k<=n<=16k<=n<=16,所有数字都可以存储为32位整数。

解题思路

本题的思路可以由简单到复杂一步步深入。首先可想到的最“硬核”的解题方法就是:每个数都有取或不取这两种可能,因此可以直接用最简单的递归解决。但考虑到时间复杂度过高的问题,要想办法对算法进行优化。根据递归过程分析,优化的方法可以从两种角度分析:选取数的个数和和的大小,即当选取数的个数超过指定个数,或者和的大小超过指定和时,都可以跳过此次递归。
由于考虑到选数是一个依次进行的过程,因此才选用递归的方法实现。

代码

#include
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值