问题:
如果小明在某一周的第一天和第三天分别吃了3个水果,且从这周第二天开始,每天所吃的水果个数与前一天相比,仅存在三种可能:或“多一个”或“持平”或“少一个”,那么,小明在这一周中每天所吃水果个数的不同选择方案共有几种?
如果用计数原理还真有些不好做,星期一的可能为2,3,4,星期四可能2,3,4,星期五可能为1,2,3,4,5,依次类推,但不可以按此计算分步原理
每一步在上一步的其基础上只有3种可能,共有3*3*3*3*3=243种,当然里面包含了为负数的情况,排除即可,从星期四开始2-1-0-(-1),仅此一种,星期二有3种,故不成立的有3种情况,所以共有240种。
ArrayList AL = new ArrayList();
//星期四
for (int i = 2; i <= 4; i++)
{
//星期五
string s = i + "-";
for (int k = i - 1; k <= i + 1; k++)
{
s += k + "-";
string fri = s;
//星期六
for (int j = k - 1; j <= k + 1; j++)
{
s += (j >= 0 ? j : 0).ToString() + "-";
string sat = s;
//星期天
for (int p = j - 1; p <= j + 1; p++)
{
s += (p >= 0 ? p : 0).ToString();
AL.Add(s);
s = sat;
}
s = fri;
}
s = i + "-";
}
}
Response.Write("总共" + AL.Count.ToString() + "<br/>");
//检查重复
for (int i = 0; i < AL.Count; i++)
{
for (int j = i + 1; j < AL.Count; j++)
{
if (AL[j].ToString() == AL[i].ToString())
{
AL.Remove(AL[j]);
j--;
}
}
}
Response.Write("去掉重复总共总共" + AL.Count.ToString() + "<br/>");
for (int i = 0; i < AL.Count; i++)
{
Response.Write(AL[i] + ";");
if ((i + 1) % 10 == 0)
{
Response.Write("<br/>");
}
}
总共81
去掉重复总共总共80
2-1-0-0;2-1-0-1;2-1-1-0;2-1-1-1;2-1-1-2;2-1-2-1;2-1-2-2;2-1-2-3;2-2-1-0;2-2-1-1;
2-2-1-2;2-2-2-1;2-2-2-2;2-2-2-3;2-2-3-2;2-2-3-3;2-2-3-4;2-3-2-1;2-3-2-2;2-3-2-3;
2-3-3-2;2-3-3-3;2-3-3-4;2-3-4-3;2-3-4-4;2-3-4-5;3-2-1-0;3-2-1-1;3-2-1-2;3-2-2-1;
3-2-2-2;3-2-2-3;3-2-3-2;3-2-3-3;3-2-3-4;3-3-2-1;3-3-2-2;3-3-2-3;3-3-3-2;3-3-3-3;
3-3-3-4;3-3-4-3;3-3-4-4;3-3-4-5;3-4-3-2;3-4-3-3;3-4-3-4;3-4-4-3;3-4-4-4;3-4-4-5;
3-4-5-4;3-4-5-5;3-4-5-6;4-3-2-1;4-3-2-2;4-3-2-3;4-3-3-2;4-3-3-3;4-3-3-4;4-3-4-3;
4-3-4-4;4-3-4-5;4-4-3-2;4-4-3-3;4-4-3-4;4-4-4-3;4-4-4-4;4-4-4-5;4-4-5-4;4-4-5-5;
4-4-5-6;4-5-4-3;4-5-4-4;4-5-4-5;4-5-5-4;4-5-5-5;4-5-5-6;4-5-6-5;4-5-6-6;4-5-6-7;
四层嵌套循环,还要适时的重置字符串,先写出程序,再分析出问题。