有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;
}