日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU1258 DFS

發布時間:2023/12/9 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 }

?

轉載于:https://www.cnblogs.com/xxx0624/archive/2013/02/17/2915029.html

總結

以上是生活随笔為你收集整理的HDU1258 DFS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。