程序示例:
#include<iostream>
using namespace std;
const int maxn = 500;
int f, w,
s, m, n, h, sum, a[4];
//Flag二维数组不断不重复地保存当前已找到的成长方式,flag保存当前找到的一种成长方式
//如示例中一种方式:flag={3 0 1 1}表示1*3+2*0+3*1+4*1=10
int Flag[maxn][4] = { 0 }, flag[4] = { 0 };
void dfs(int day,int energy) //day:当前的天数,energy:当前的生命值
{
if (energy == n && day <= h)
{
for (int i = 0;i<=sum;i++)
{
if (Flag[i][0] ==flag[0] && Flag[i][1] == flag[1] && Flag[i][2] == flag[2]&& Flag[i][3] == flag[3])//防止重复
return;
}
sum++;//成长方式数
for (int i = 0;i <=3;i++)
{
Flag[sum][i]= flag[i];//不重复即保存
}
return;
}
if (energy > n) //生命值
return;
if (day > h)//天数
return;
for (int i = 0;i <=3;i++)//四种选择遍历
{
energy += a[i];
day++;
flag[i]++;
dfs(day, energy);
energy -= a[i];
day--;
flag[i]--;
}
}
int main()
{
cin>>f>>w>>s>>m>>n>>h;
a[0]= f;
a[1]= w;
a[2]= s;
a[3]= m;
dfs(0,0);
if (sum == 0)
cout<< "NO" << endl
else
cout<< sum;
return 0;
}