Description
Input
Output
Sample Input
9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0
Sample Output
6
5
解题关键:两个重要剪枝,1.当回来时没有用上最大的值时肯定组合失败(最大数筛) 2.当失败回来时回溯到上一组,同时有一个大块可以匹配,那么后面的元素不需要再考虑,因为此时即使后面有能够匹配的也是不成立的情况。
#include
#include
#include
#include
#include
using namespace std;
int n;
int s[100];
int vis[100];
int ok;
void dfs(int len,int sum,int le,int N,int r)
{
if(le==N)
{
ok=1;
return ;
}
if(sum==len)
{
dfs(len,0,le+1,N,0);
}
for(int i=r;ib;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
int sum=0;
for(int i=0;i