TOJ--1343--dfs
2014-06-13 16:09
232 查看
先碎碎念一段:~
今天凌晨熬夜看个比赛... 桑巴军团 太让我失望了 华丽与你们无缘了。。。 竟然还要靠那个 不存在 的点球.......
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种 就直接通过一个间接变量 保存了下 我本次递归开始的头元素的值 然后进行判断。。。
接下来 上代码......
View Code
搜索 还是很有意思的......
today:
何日功成名遂了,还乡。醉笑陪公三万场
酒不醉人人自醉 酒暖人心
今天凌晨熬夜看个比赛... 桑巴军团 太让我失望了 华丽与你们无缘了。。。 竟然还要靠那个 不存在 的点球.......
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种 就直接通过一个间接变量 保存了下 我本次递归开始的头元素的值 然后进行判断。。。
接下来 上代码......
// TOJ 1343 数字 降序 出现 // 给你一个n 和m个数据的数组 用该数组内的元素进行相加得到n 输出所有的可能情况 #include <iostream> #include <cstring> using namespace std; int n , m; int arr[15]; int temp[1100]; bool flag; void dfs( int sum , int pos , int cnt ) { //int testMuilti = 0; --- 这边初始值 你只要设定一个不在1~100的内都可以 它只是起判断作用 bool vis[110]; memset( vis , false , sizeof(vis) ); if( sum>n ) return; else if( sum == n ) { flag = true; printf( "%d",temp[0] ); for( int i = 1 ; i<cnt ; i++ ) { printf( "+%d",temp[i] ); } printf( "\n" ); } else { for( int i = pos ; i<m ; i++ ) { if( sum+arr[i]<=n && !vis[ arr[i] ] ) { vis[ arr[i] ] = true; temp[cnt] = arr[i]; dfs( sum+arr[i] , i+1 , cnt+1 ); } /* if( sum+arr[i]<=n && arr[i]!=testMuilti ) { testMuilti = arr[i]; temp[cnt] = arr[i]; dfs( sum+arr[i] , i+1 , cnt+1 ); } */ } } } int main() { while( ~scanf("%d %d",&n,&m)&&m ) { flag = false; for( int i = 0 ; i<m ; i++ ) { scanf( "%d",&arr[i] ); } printf( "Sums of %d:\n",n ); dfs(0,0,0); if( !flag ) printf( "NONE\n" ); } return 0; }
View Code
搜索 还是很有意思的......
today:
何日功成名遂了,还乡。醉笑陪公三万场
酒不醉人人自醉 酒暖人心
相关文章推荐
- TOJ--1162---dfs(回溯)
- TOJ 3162 Hay For Sale --DFS
- UVa 1343 旋转游戏(dfs+IDA*)
- POJ 2488 DFS+记录路径 TOJ 3520 BFS+记录路径
- TOJ 1398 Square --DFS
- TOJ1003 Transportation(DFS)
- 【TOJ】1070. Ouroboros Snake --构造?DFS?欧拉回路?【TOJ】3381. DeBruijin
- TOJ--3100:Getting Gold (DFS)
- toj-1959-OilDeposits(dfs)
- TOJ---2816--dfs(巨水)
- TOJ 1398.Square(DFS+减枝经典题目)
- POJ2362:Square(DFS)
- POJ 2965 The Pilots Brothers' refrigerator(dfs)
- uva1343 旋转游戏
- 【递推】【DFS】【枚举】Gym - 101246C - Explode 'Em All
- MFC dfs遍历文件
- 7.23多校——5305DFS——Friends
- BFS宽度搜索(队列)与DFS深度搜索(递归)
- HDU 1584 蜘蛛牌(DFS)
- TOJ 1772