zoukankan      html  css  js  c++  java
  • TOJ--1343--dfs

    先碎碎念一段:~

      今天凌晨熬夜看个比赛... 桑巴军团 太让我失望了 华丽与你们无缘了。。。  竟然还要靠那个 不存在 的点球.......

      shame

      今晚 有 荷兰打西班牙 虽然两个球队 都无爱  西班牙的踢球风格不喜欢.....  荷兰 橙色 还是很震撼的......... 他们这也算上届世界杯决赛小组赛就碰到。。。
    OK:

      我们上题吧  这是一个dfs题

        touch me

    题目大意就是:

      给你一个n 和m个数据的数组 用该数组内的元素进行相加得到n 输出所有的可能情况

      你要注意 下 这句话的含义  A number can be used within a sum as many times as it appears in the list, and a single number counts as a sum

      就是说 一个数字可以被使用的次数最多就是它在数组中出现的次数  一个数字自己可以单独做为和 只要与n相等

      还有很重要的一点: The numbers within each sum must appear in nonincreasing order   就是数组在你输入的时候就要确定是按递减输入的

      那么 就省得我们自己去排序了

    我的思路:dfs它   递归的出口条件自然是  我们不断搜索 得到的sum>n那就结束这次搜索 如果sum==n 那就输出这个sum中各个元素的值 它通过数组来进行保存   这边的关键是 对于重复元素的剪枝   相当于我给你一组数据 4 4 2 2 1 1

    你的输出结果 应该是 2+2  2+1+1  如果你没处理好这两个2之间的关系 那么 你将会输出 2+2  2+1+1  2+1+1

    OK 这就是本题的重点。  我通过下面2种方法来实现它

    对于第1种 我开的 bool vis[]数组的位置很重要  它必须开在dfs函数中 而不能当作全局变量 因为这样会影响其它的递归 它们是各自独立的

    第2种 就直接通过一个间接变量 保存了下 我本次递归开始的头元素的值 然后进行判断。。。

    接下来 上代码......

     1 // TOJ 1343 数字 降序 出现
     2 // 给你一个n 和m个数据的数组 用该数组内的元素进行相加得到n 输出所有的可能情况
     3 
     4 #include <iostream>
     5 #include <cstring>
     6 using namespace std;
     7 
     8 int n , m;
     9 int arr[15];
    10 int temp[1100];
    11 bool flag;
    12 
    13 
    14 void dfs( int sum , int pos , int cnt )
    15 {
    16     //int testMuilti = 0;   --- 这边初始值 你只要设定一个不在1~100的内都可以 它只是起判断作用
    17     bool vis[110];
    18     memset( vis , false , sizeof(vis) );
    19     if( sum>n )
    20         return;
    21     else if( sum == n )
    22     {
    23         flag = true;
    24         printf( "%d",temp[0] );
    25         for( int i = 1 ; i<cnt ; i++ )
    26         {
    27             printf( "+%d",temp[i] );
    28         }
    29         printf( "
    " );
    30     }
    31     else
    32     {
    33         for( int i = pos ; i<m ; i++ )
    34         {
    35             if( sum+arr[i]<=n && !vis[ arr[i] ] )
    36             {
    37                 vis[ arr[i] ] = true;
    38                 temp[cnt] = arr[i];
    39                 dfs( sum+arr[i] , i+1 , cnt+1 );
    40             }
    41             /*
    42             if( sum+arr[i]<=n && arr[i]!=testMuilti )
    43             {
    44                 testMuilti = arr[i];
    45                 temp[cnt] = arr[i];
    46                 dfs( sum+arr[i] , i+1 , cnt+1 );
    47             }
    48             */
    49         }
    50     }
    51 }
    52 
    53 int main()
    54 {
    55     while( ~scanf("%d %d",&n,&m)&&m )
    56     {
    57         flag = false;
    58         for( int i = 0 ; i<m ; i++ )
    59         {
    60             scanf( "%d",&arr[i] );
    61         }
    62         printf( "Sums of %d:
    ",n );
    63         dfs(0,0,0);
    64         if( !flag )
    65             printf( "NONE
    " );
    66     }
    67     return 0;
    68 }
    View Code

    搜索 还是很有意思的......

    today:

      何日功成名遂了,还乡。醉笑陪公三万场

      酒不醉人人自醉  酒暖人心

    just follow your heart
  • 相关阅读:
    c# 框架学习(nop )总结-------删除功能
    c# 框架学习(nop )总结-------编辑功能
    约束
    索引
    受限操作的变通解决方案
    删除数据表
    修改已有数据表
    定义外键
    定义主键
    定义默认值
  • 原文地址:https://www.cnblogs.com/radical/p/3786046.html
Copyright © 2011-2022 走看看