标签:
4 1 2 4 7 13 4 1 2 4 7 15
Of course,I can! Sorry,I can‘t!
题意:很简单,就是给你一个数组,和一个值k,是否能从数组中找到n个数之和等于k
思路:直接dfs,不过这个题好像时间有点限制,所以要一个简单的剪枝
Code:
//开始的思路不是很清晰,太盲目的做,因为初始化和回溯的问题wa了两次,然后改好之后又果断超时了,没有考虑剪枝和重复搜索的问题.
//看了一下别人的代码瞬间开窍了,这么简单的题目还wa真是醉了
#include <stdio.h>
#include <string.h>
int a[20],n,k,flage,vis[20];
void dfs(int now,int sum)
{
int i;
if(sum>=k)
{
if(sum==k)
flage=1;
return ;
}
else
{
for(i=now;i<n;i++) //这里从now开始就行了,之前的思路是把所有的情况全部考虑了中间会出现重复的情况
{
if(vis[i]==0)
{
vis[i]=1;
sum+=a[i];
dfs(i+1,sum);
if(flage) //这里做了一个剪枝,如果已经可以找到,那么后面就不用找了
return;
sum-=a[i];
vis[i]=0;
}
}
}
}
int main()
{
int sum,i;
while(scanf("%d",&n)!=EOF)
{
flage=0;
sum=0;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
dfs(0,0);
if(flage)
printf("Of course,I can!\n");
else
printf("Sorry,I can't!\n");
}
return 0;
}
nyoj927 The partial sum problem(dfs)
标签:
原文地址:http://blog.csdn.net/sxx312/article/details/51353774