一道算法题。求助各位

只看楼主收藏回复

如图


来自iPhone客户端1楼2017-10-29 15:35回复
    dd


    来自iPhone客户端2楼2017-10-29 15:36
    回复
      d


      来自iPhone客户端4楼2017-10-29 15:54
      回复
        C被拆开为C个1,如果C小于n再补充0,然后组合


        来自Android客户端5楼2017-10-29 16:06
        收起回复
          d


          来自iPhone客户端6楼2017-10-29 17:47
          回复
            我手机写的被吃了


            来自Android客户端8楼2017-10-29 17:56
            收起回复
              #include<vector>
              #include<iostream>
              using namespace std;
              void f(int m, int n, int c, vector<int>& vec, vector<vector<int>>&re)
              {
              if (m == n ) {
              if(c==0)
              re.push_back(std::move(vec));
              return; }
              for (int i = 0; i <= c; i++)
              {
              vector<int> v(vec);
              v.push_back(i);
              f(m + 1, n, c - i, v, re);
              }
              }
              int main()
              {
              int n, c;
              cin >> n >> c;
              vector<int> vec;
              vector<vector<int>> re;
              f(0, n, c, vec, re);
              for (auto &c : re)
              {
              for (auto c2 : c)
              cout << c2 << " ";
              cout << endl;
              }
              return 0;
              }
              //这个差不多对了,但是应该可以改进


              10楼2017-10-29 18:24
              回复
                关键函数可以改成这样
                void f(int m, int n, int c, vector<int>& vec, vector<vector<int>>&re)
                {
                if (m == n-1 ) {
                vec.push_back(c);
                re.push_back(std::move(vec));
                return; } for (int i = 0; i <= c; i++)
                {
                vector<int> v(vec);
                v.push_back(i);
                f(m + 1, n, c - i, v, re);
                }
                }


                11楼2017-10-29 18:28
                收起回复
                  本来你这个可能性就太多


                  来自Android客户端12楼2017-10-29 18:33
                  收起回复
                    x^(n+1)-(1+C)x+C=0解方程就行了


                    来自Android客户端13楼2017-11-01 15:14
                    收起回复

                      python写了一个,参考一下。


                      15楼2017-11-01 21:55
                      回复
                        给你个思路,原题等价于c分成c个1,然后将这c个1分成n份,每份对应一个xi。
                        然后呢,如何将c个1分成n份,就是在c个1中间插n-1个棒子(头尾必须要有棒子),棒子位置可以重叠(两个相邻棒子之间1的个数即对应的xi)。棒子最开始可以随便插,为了保证解不重复,记录棒子的位置信息,然后对棒子的位置按从小到大排序,得出相邻的棒子中1的个数,即为1组解。这样说是不是比代码直观?注意从随意插棒子到棒子位置排序这一步棒子组的解会有重复,要记录排序后的棒子组的信息,重复的剔除。


                        来自Android客户端16楼2017-11-02 10:12
                        回复
                          更进一步的,节省排序这步,譬如第一个棒子在1位置(假设对每个1所在的位置有个位置信息,第一个1,第二个1这样),那么第二个棒子只能在1位置之后(可以重叠,重叠即说明xi有0),依次类推,这样循环会节省很多,不过变量也会用很多就是了。


                          来自Android客户端17楼2017-11-02 10:19
                          回复


                            来自Android客户端18楼2017-11-02 10:43
                            回复
                              万能的穷举法


                              19楼2017-11-02 11:19
                              回复