zoukankan      html  css  js  c++  java
  • HDU1258 DFS

    题意:求n个数中的某些数的和等于t,并输出

    dfs

    记录下已经输出过的,然后每次比较一下,这样就能避免重复

    View Code
      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<stdlib.h>
      4 #include<algorithm>
      5 using namespace std;
      6 const int maxn = 15;
      7 const int maxm = 500005;
      8 int num[ maxn ];
      9 int vis[ maxn ];
     10 int ans[ maxn ];
     11 int t,n;
     12 int flag;
     13 int new_start;
     14 struct node{
     15     int cnt;
     16     int ans[ maxn ];
     17 }my[ maxm ],temp;
     18 int cnt_my;
     19 int judge( ){
     20     sort( temp.ans,temp.ans+temp.cnt );
     21     for( int i=0;i<cnt_my;i++ ){
     22         if( temp.cnt==my[i].cnt ){
     23             int k;
     24             int fff=1;
     25             for( k=0;k<temp.cnt;k++ ){
     26                 if( temp.ans[k]==my[i].ans[k] )
     27                 {}
     28                 else{
     29                     fff=-1;
     30                     break;
     31                 }
     32             }
     33             if( fff==1 )
     34                 return i;//exist
     35         }
     36     }
     37     for( int i=0;i<temp.cnt;i++ ){
     38         my[ cnt_my ].ans[ i ]=temp.ans[i];
     39     }
     40     my[ cnt_my ].cnt=temp.cnt;
     41     cnt_my++;
     42     return -1;
     43 }
     44 int judge2(int p){
     45     int sum=0;
     46     for( int i=p;i<=n;i++ ){
     47         sum+=num[i];
     48     }
     49     return sum;
     50 }
     51 void dfs( int pos,int sum,int cnt ){
     52     if( sum==t ){
     53         temp.cnt=cnt;
     54         for( int i=0;i<cnt;i++ ){
     55             temp.ans[i]=ans[i];
     56         }
     57         if( judge()==-1 ){
     58             flag=1;
     59             for( int i=0;i<cnt;i++ ){
     60                 if( i==0 ) printf("%d",ans[i]);
     61                 else printf("+%d",ans[i]);
     62             }
     63             printf("\n");
     64         }
     65         //new_start++;
     66         return ;
     67     }
     68     for( int i=new_start;i<=n;i++ ){
     69         if( vis[ i ]==0&&(sum+num[i])<=t ){
     70             int ttt=judge2( i );
     71             for( int k=0;k<cnt;k++ )
     72                 ttt+=ans[k];
     73             if( ttt<t ) return ;
     74             vis[ i ]=1;
     75             ans[ cnt ]=num[i];
     76             dfs( i,sum+num[i],cnt+1 );
     77             vis[ i ]=0;
     78         }
     79     }
     80     return ;
     81 }
     82 
     83 int main(){
     84     while( scanf("%d%d",&t,&n),n ){
     85         for( int i=1;i<=n;i++ ){
     86             scanf("%d",&num[ i ]);
     87             vis[i]=0;
     88         }
     89         flag=-1;
     90         cnt_my=0;
     91         printf("Sums of %d:\n",t);
     92         for( int i=1;i<=n;i++ ){
     93             if( num[i]>t ) {
     94                 vis[i]=1;
     95                 continue;
     96             }
     97             if( num[i]==t&&flag==-1 ){//在这个判断条件上wa了一次!!!flag!=-1
     98                 flag=1;
     99                 vis[i]=1;
    100                 my[ 0 ].cnt=1;
    101                 my[ 0 ].ans[0]=t;
    102                 cnt_my++;
    103                 printf("%d\n",t);
    104                 continue;
    105             }
    106             if( num[i]==t&&flag==1 ){
    107                 vis[i]=1;
    108                 continue;
    109             }
    110             new_start=i;
    111             dfs( i,0,0 );//pos sum cnt
    112             break;
    113         }
    114         if( flag==-1 )
    115             printf("NONE\n");
    116         //printf("end\n");
    117     }
    118     return 0;
    119 }
    keep moving...
  • 相关阅读:
    LLC半桥谐振变换器调试记录
    工业派学习记录
    ubuntu 命令记录
    电容单位换算
    Windows快捷键
    CAN总线学习笔记
    Scala 基础(十五):Scala 模式匹配(三)
    Scala 基础(十四):Scala 模式匹配(二)
    Scala 基础(十三):Scala 模式匹配(一)
    scala 数据结构(十一):流 Stream、视图 View、线程安全的集合、并行集合
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2915029.html
Copyright © 2011-2022 走看看