mltang

博客园 首页 新随笔 联系 订阅 管理

给你两个数t,n

接下来输入n个数字

让你输出所有数字相加等于n的组合

4  6  4  3  2  2  1  1

t   n

4

3+1

2+2

2+1+1

Sample Input

4 6 4 3 2 2 1 1
5 3 2 1 1
400 12 50 50 50 50 50 50 25 25 25 25 25 25 0 0

Sample Output

Sums of 4:
4
3+1
2+2
2+1+1
Sums of 5:
NONE
Sums of 400:
50+50+50+50+50+50+25+25+25+25
50+50+50+50+50+25+25+25+25+25+25
 
 
其实就是个简单的dfs,一开始我还以为什么背包问题,结果发现想太多;
#include <iostream>
using namespace std;
int n,m;
int a[15],lu[15];
int cnt = 0;
void dfs(int k,int t);
bool flag;
int main()
{
    int i,j;
    while(scanf("%d%d",&m,&n) && m)
    {
        flag = false;
        for(i=0;i<n;++i)
            scanf("%d",a+i);
        printf("Sums of %d:\n",m);
            dfs(-1,m);
        if(!flag)
            printf("NONE\n");
    }
}
void dfs(int k,int t)
{
    if(t == 0)
    {
        flag = true;
        printf("%d",lu[0]);
        for(int i=1; i<cnt; ++i)
        {
            printf("+%d",lu[i]);
        }
        printf("\n");
        return ;
    }
    if(t < 0)
        return ;
    for(int j=k+1; j<n; ++j)
    {
        if(t >= a[j])
        {
            lu[cnt++] = a[j];
            dfs(j,t-a[j]);
            while(j < n-1 && a[j] == a[j+1])   //防止重复的元素进入
                j ++;
            cnt --;
        }
    }
}

 

posted on 2018-04-06 18:32  mltang  阅读(132)  评论(0编辑  收藏  举报