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!
代码:
#include <stdio.h>
#include <string.h>
int n;
int num[25];
int flag,sum,temp;
void DFS(int x)
{
if(sum==temp)
{
if(!flag)
{
printf("Of course,I can!\n");
flag=1;
}
}
if(sum>temp)
{
return;
}
for(int i=x;i<n;i++)
{
sum+=num[i];
DFS(i+1);
sum-=num[i];
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
flag=0;
memset(num,0,sizeof(num));
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
scanf("%d",&temp);
DFS(0);
if(!flag)
printf("Sorry,I can't!\n");
}
return 0;
}
第一次在oj上提交的,用时28ms,后来改进了代码
#include <stdio.h>
#include <string.h>
int n,k;
int num[21];
int flag;
void DFS(int x,int sum)
{
if(sum>=k)
{
if(sum==k)
{
if(!flag)
{
printf("Of course,I can!\n");
flag=1;
}
}
else
return;
}
if(x==n)
return;
DFS(x+1,sum+num[x]);
DFS(x+1,sum);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
flag=0;
memset(num,0,sizeof(num));
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
scanf("%d",&k);
DFS(0,0);
if(!flag)
printf("Sorry,I can't!\n");
}
return 0;
}
这次用时16ms,提高了时间效率。