NSOJ Thepartialsumproblem



Thepartialsumproblem

时间限制: 1000ms
内存限制: 128000KB
64位整型:      Java 类名:
类型: 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •                   
  • 题目描述

    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!
    

    来源

    题解 :简单的深搜,如果只是每次循环结果sum判断,会超时,应该和总和的差值sum1-sum一起判断,这样才不会超时。


    #include<stdio.h>
    #include<string.h>
    int a[21],book[21],n,m,flag,sum1;
    void dfs(int sum )
    {
    	if(sum==m||sum1-sum==m)     
    	  flag=1;
        if(sum>n)
    	  return ;
    	if(flag)
       	 return ;
    	for(int i=0;i<n;i++)
    		if(!book[i])
    		{
    			book[i]=1;
    			dfs(sum+a[i]);
    			book[i]=0;
    		}
    		return ;
    }
    int main()
    {
    	while(~scanf("%d",&n))
    	{
    	  sum1=0;
    	  for(int i=0;i<n;i++)
    	  {
    	    scanf("%d",&a[i]);
    	    sum1+=a[i];
    	  }
    	  scanf("%d",&m); 
    	  memset(book,0,sizeof(book));
    	  flag=0;   dfs(0);
    	  if(flag)
    	  printf("Of course,I can!\n");
    	  else printf("Sorry,I can't!\n");
    	} 
    	return 0;
    }


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值