百鸡百钱问题描述为:用100元钱买100只鸡,已知每只公鸡5元,每只母鸡3元,3只小鸡1元,问能买多少只公鸡、母鸡和小鸡?试将该类问题用一个类来表示,百鸡百钱问题只是这个类如CChickProblem的一个实例,假设各种鸡的价格不变,类中数据成员有总钱数、要买的总的鸡数、能买到的母鸡、小鸡和公鸡的数量。成员函数有构造和析构函数,求问题解的函数findSolution,打印问题解的函数printSolution。(要求用动态数组保存问题的所有解)
编写程序求解该类问题。
输入
测试数据的组数 t
第一组 鸡数 钱数
第二组 鸡数 钱数
…
输出
第一组解个数
第一组第一个解公鸡数 母鸡数 小鸡数
第一组第二个解公鸡数 母鸡数 小鸡数
…
第二组解个数
第二组第一个解公鸡数 母鸡数 小鸡数
第二组第二个解公鸡数 母鸡数 小鸡数
…
输入
2
100 100
200 200
输出
3
4 18 78
8 11 81
12 4 84
7
4 43 153
8 36 156
12 29 159
16 22 162
20 15 165
24 8 168
28 1 171
#include <iostream>
using namespace std;
class CChickProblem
{
private:
int chick;
int money;
int *s;
public:
CChickProblem(int c,int m):chick(c),money(m) { }
~CChickProblem()
{
delete []s;
}
void findSolution()
{
int gongji=money/5;
int muji=money/3;
int xiaoji=chick;
int n=xiaoji;
s = new int[n+1];
s[0]=0;
int i,j,z,k=1;
for(i=1;i<gongji;i++)
{
for(j=1;j<muji;j++)
{
z=chick-i-j;
if(z%3==0 && 5*i+3*j+z/3==money)
{
s[0]++;
s[k++]=i;
s[k++]=j;
s[k++]=z;
}
}
}
}
void printSolution()
{
cout<<s[0]<<endl;
for(int i=0;i<s[0];i++)
{
cout<<s[3*i+1]<<" "<<s[3*i+2]<<" "<<s[3*i+3]<<endl;
}
}
};
int main()
{
int t;
cin>>t;
while (t--)
{
int chick,money;
cin>>chick>>money;
CChickProblem c(chick,money);
c.findSolution();
c.printSolution();
}
return 0;
}