输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.

来源:互联网 发布:申请淘宝达人网址 编辑:程序博客网 时间:2024/06/05 16:33

这道题的思路参考0-1背包:定义函数F(n,m)来求解这个问题,那么F(n,m)可以分解为两个子问题F(n-1,m)和F(n-1,m-n).由于题目要求列出所有的组合,使用类似动态规划的方法比较复杂,我在这里直接使用递归来解决这个问题。虽然效率可能不是很好,但是代码的可读性还是比较好的。

#include <iostream>#include<malloc.h>#include<string.h> using namespace std; int length; void PrintSolutions(int *flag)  {  for (int i=0; i<length; i++)   {        if (flag[i] == 1)         {            cout << i+1 << "  ";         }     }    cout << endl;} void BagProblem(int m, int n, int *flag) {     if(n<1 || m<1)        return;    if(m < n)        n = m;     if (n == m)     {        flag[n-1] = 1;        PrintSolutions(flag);        flag[n-1] = 0;     }    flag[n-1] = 1;    BagProblem(m-n, n-1, flag);    flag[n-1] = 0;    BagProblem(m, n-1, flag); }int main() {    int m, n;    cin >> m >> n;    length = n;    int *flag = (int *)malloc(sizeof(int)*n);    memset(flag, 0, sizeof(flag));    BagProblem(m,n,flag);    //delete flag;//这个地方犯了一个原则性的错误 new和delete成对使用, malloc应该和free成对使用,要不然就会造成内存泄露    free(flag);    return 0; }


阅读全文
0 0