nyoj927 The partial sum problem(dfs)

来源:互联网 发布:web前端js框架 知乎 编辑:程序博客网 时间:2024/06/10 09:24

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!”.
样例输入
41 2 4 71341 2 4 715
样例输出
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;}



0 0
原创粉丝点击