The partial sum problem
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
One day,Tom’s girlfriend give him an array A which contains N integers and asked him:Can you choose some integers from the N integers and the sum of them is equal to K.
-
输入
-
There are multiple test cases.
Each test case contains three lines.The first line is an integer N(1≤N≤20),represents the array contains N integers. The second line contains N integers,the ith integer represents A[i](-10^8≤A[i]≤10^8).The third line contains an integer K(-10^8≤K≤10^8).
输出
- If Tom can choose some integers from the array and their them is K,printf ”Of course,I can!”; other printf ”Sorry,I can’t!”. 样例输入
-
4 1 2 4 7 13 4 1 2 4 7 15
样例输出
-
Of course,I can! Sorry,I can't!
-
There are multiple test cases.
题意:很简单,就是给你一个数组,和一个值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;
}