给定数m,求由n位数的组成m的数列(m>=n>0)

  在一个C语言群看到有人问问题,图:
这里写图片描述
  于是乎想起了以前做过一个类似的算法题,http://blog.csdn.net/qq_21049875/article/details/77849257,还没写完,不过也不想补坑了(懒),因为在看到这个问题的例如,突然想到了一种方法去解决类似的问题,也就是这道题我的解决思想,也有些dfs的感觉。
  想法:数分为类似于第一个结果{5,1,1,1}然后我们就根据这个结果去推导后面的结果,设定类似于指针的head与end,head=ary[0],end=ary[1],如上便是*head=5,*end=1,通过运算,得到*head=4,*end=2,*head=3,*end=3,则两组结果,然后就移动head与end的位置(head++,end++),直到最后两位,也就到了{3,2,2,1},head=2,end=1,则head回溯(head–),找到3,然后head=2,end=2就得到{2,2,2,2}最后一个数列,除此之外,还要考虑{4,2,2}类似的情况(在测试n=3,m=8的找到的问题)

代码:

vector<vector<int>> divsl(int n,int m)
{
    if (n > m)
    {
        cout << "error" << endl;
        exit(0);
    }
    vector<int>ary;
    vector<vector<int>>m_ary;
    int s = m - n + 1;
    ary.push_back(s);
    for (int i = 1; i < n; i++)
    {
        ary.push_back(1);
    }
    m_ary.push_back(ary);
    int head = 0, end = 1;//依靠head与end找出要+1的数
    while (end<n&&head>=0)
    {
        if ((ary[head] - 1) > ary[end])
        {
            ary[head] = ary[head] - 1;
            ary[end] = ary[end] + 1;
            m_ary.push_back(ary);
        }
        else if (ary[head] == ary[end]&&end<n-1)
        {
            head++;
            end++;
        }
        else if (ary[head] == ary[end]&&end==n-1)
        {
            head--;
            end--;
        }
        else if (ary[head] == ary[end] + 1&&end<n-1)
        {
            head++;
            end++;
        }
        else if (ary[head] == ary[end] + 1 && end == n - 1)
        {
            head--;
        }

    }
    return m_ary;
}

int main()
{
    auto temp = divsl(4, 8);
    for (auto i : temp)
    {
        for (auto j : i)
        {
            cout << j << " ";
        }
        cout << endl;
    }
    return 0;
}

m=8,n=4的结果:
这里写图片描述

m=8,n=3的结果:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值