Sum It Up---poj1564(dfs)

题目链接:http://poj.org/problem?id=1564

给出m个数,求出和为n的组合方式;并按从大到小的顺序输出;

简单的dfs但是看了代码才会;

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, flag;
int a[11000], b[11000];
int cmp(int a, int b)
{
    return a>b;
}
void dfs(int pos, int len, int sum)///pos代表位置;
{
    if(sum==n)
    {
        flag=1;
        printf("%d", b[0]);
        for(int i=1; i<len; i++)
            printf("+%d", b[i]);
        printf("\n");
        return ;
    }
    for(int i=pos; i<m; i++)
    {
        if(sum+a[i]<=n)
        {
            b[len]=a[i];
            dfs(i+1, len+1, sum+a[i]);
            while(i+1<m && a[i]==a[i+1])i++;///去重;
        }
    }
}
int main()
{
    while(scanf("%d %d", &n, &m), m+n)
    {
        for(int i=0; i<m; i++)
            scanf("%d", &a[i]);
        sort(a, a+m, cmp);
        flag = 0;
        printf("Sums of %d:\n", n);
        dfs(0, 0, 0);
        if(flag==0)
            printf("NONE\n");
    }
    return 0;
}

时间: 2024-09-30 02:18:57

Sum It Up---poj1564(dfs)的相关文章

LeetCode Subsets (DFS)

题意: 给一个集合,有n个互不相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: DFS方法:由于集合中的元素是不可能出现相同的,所以不用解决相同的元素而导致重复统计. 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 return a

poj3187Backward Digit Sums(DFS)

题目链接: huangjing 思路: 这个题目想到dfs很容易,但是纠结在这么像杨辉三角一样计算那些值,这个我看的队友的,简直厉害,用递归计算出杨辉三角顶端的值....具体实现详见代码... 题目: Language: Default Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4285   Accepted: 2474 Description FJ and his cows

HJDU 1518—— Square(DFS)

简单深搜~~~~ <strong>#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<functional> #define M 30 using namespace std; int vis[M],a[M],n,flag,sum; void dfs(int s,int cur,int d) { if(cur==3||fl

poj 2488 A Knight&#39;s Journey (DFS)

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34660   Accepted: 11827 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey ar

搜索——深度优先搜索(DFS)

设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法. 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进.如果选择的这个岔路前方是一条死路,就退回到这个岔道口,选择另一个岔路前进.如果岔路口存在新的岔道口,那么仍然按上面的方法枚举新岔道口的每一条岔道.这样,只要迷宫存在出口,那么这个方法一定能够找到它. 也就是说,当碰到岔道口时,总是以"深度"作为前进的关键词,不碰到死胡同就不回头,因此这种搜索的方式称为深

Codeforces 982 C. Cut &#39;em all!(dfs)

解题思路: 代码中有详细注解,以任意一点为根,dfs遍历这棵树. 每一个节点可能有好几个子树,计算每棵子树含有的节点数,再+1即为这整棵树的节点. 判断子树是否能切断与根之间的联系,如果子树含有偶数个节点,则这棵子树可以被切断. 注意: 若由于我们建立这棵树的时候不知道两个连接的节点谁是谁的父节点. 所以我们在dfs中加个标记,找出除父节点以外的其他节点. #include <bits/stdc++.h> using namespace std; typedef long long ll; l

POJ 3087 Shuffle&#39;m Up (DFS)

题目链接:Shuffle'm Up 题意:有a和b两个长度为n的字符序列,现定义操作: 将a.b的字符交叉合并到一个序列c,再将c最上面的n个归为a,最下面n个归为b 给出a,b和目标序列c,问最少多少次操作a.b转化为c 解析:将a.b放入哈希表,然后模拟操作过程直接dfs即可. AC代码: #include <cstdio> #include <iostream> #include <cstring> #include <map> using names

POJ 1699 Best Sequence(DFS)

題目鏈接 題意 : 將幾個片段如圖所示方法縮成一個序列,求出最短這個序列. 思路 : 其實我也不知道怎麼做.....看網上都用了DP.....但是我不會.....這個DP不錯,還有用KMP+状压DP做的 1 //1699 2 #include <iostream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <string> 6 7 using namespace std; 8 9 string

LeetCode Subsets II (DFS)

题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) 1 class Solution { 2 public: 3 vector<vector<int>> subsets(vector<int>& nums) { 4 sort(nums.begin(),nums.end()); 5 DFS(0,nums,tmp); 6 ans.push_back(vector

poj A Knight&#39;s Journey(DFS)

题目链接:http://acm.hrbust.edu.cn/vj/index.php?c=problem-problem&id=190592 题意:给出p*q的棋盘,从(A,1)开始,走“日”字,问能否走完棋盘上所有的点,如果能,按字典序输出路径: 思路:DFS,并保存路径即可,注意处理走的方向顺序int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}}; #include <stdio.h> #in