递归全组合问题

有m个砝码,重量分别为1g,2g,3g,……,mg,问可以组合成多少种重量,每种重量有多少种组合方式,例如:
输入1,2,3;输出6,{1,1},{2,1},{3,2},{4,1},{5,1},{6,1},表示能组合成3种重量,括号中第一个数表示重量,第二个数表示组合方式数量。

#include "stdafx.h"
#include<iostream>
using namespace std;
//全局变量,用于存放结果,w[i]表示重量i的组合方式数量
int w[100];
//递归函数,用于求取结果
void fun1(int *array, int length)
{
    //结束递归的条件
    if (length == 1)
    {
        w[array[0]]++;
        return;
    }


    fun1(array + 1, length - 1);//递归

    //记录此轮递归的结果
    for (int j = 99; j >= 0; j--)
    {
        if (w[j] != 0)
        {
            w[j + array[0]]++;
        }
    }
    w[array[0]]++;

}

//显示函数,用于输出结果
void fun(int *array, int length)
{
    fun1(array, length);
    int num=0;
    //输出重量的数量
    for (int i = 0; i < 100; i++)
    {
        if (w[i] != 0)
            num++;
    }
    cout << num;

    // 输出每种重量的组合次数
    for (int i = 0; i < 100; i++)
    {
        if (w[i] != 0)
            cout << "," << "{" << i << "," << w[i] << "}";
    }

}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[3] = { 1, 2,3 };
    fun(a, 3);
    return 0;
}
点赞