代码如下:
/*********************************************************************************
*功能:解决和尚挑水问题,问题在下方
*作者:lml 时间:2020年4月14日 13:22
*问题:有一天,老和尚让小和尚将A桶的水挑到B桶去,可是小和尚却想下山玩,不愿意挑水,
*老和尚便说:"如果你能够根据我的提示算出A桶中有多少升水,我便许你下山去玩。"
*小和尚欣然接受。老和尚说道:"在你面前有五个小水桶,它们分别可以装1、2、3、4、5
*升水。如果你每次用其中两个桶去挑水,那么恰好可以挑6次;如果你用三个桶去挑水,
*那么恰好可以挑4次;如果你用四个桶去挑水,那么恰好可以挑2次。"那么,A桶中一共有
*多少升水?
********************************************************************************/
#include <stdio.h>
int main(int argc, const char *argv[])
{
int t[5]={
1,2,3,4,5};//定义五个桶
//挑选四个桶,排列一下
int ft1[4]={
1,2,3,4};
int ft2[4]={
1,2,3,5};
int ft3[4]={
1,2,4,5};
int ft4[4]={
1,3,4,5};
int ft5[4]={
2,3,4,5};
int ftt[5]={
0}; //每种排列的和存在这里
int i=0,j=0,k=0,n=0;
int val[5]={
0},sig=0;
//四个桶的升数相加
for(i=0;i<4;i++){
ftt[0] = ftt[0]+ft1[i];
ftt[1] = ftt[1]+ft2[i];
ftt[2] = ftt[2]+ft3[i];
ftt[3] = ftt[3]+ft4[i];
ftt[4] = ftt[4]+ft5[i];
}
//判断用两个桶挑6次与四个桶挑2次作比较
//得到的值可能有多种情况,每种情况放在val数组里
for(i=0;i<5;i++){
for(j=0;j<5;j++){
for(k=0;k<5;k++){
if(i!=j){
if((t[i]+t[j]) * 6 == 2*ftt[k]){
printf("1->i:%d j:%d k:%d\n",i,j,k);
val[sig] = 2*ftt[k];
sig++;
}
}
}
}
}
//用上面筛选满足的情况和三个桶挑四次的情况比较,满足的就是结果
for(i=0;i<5;i++){
for(j=i+1;j<5;j++){
for(k=j+1;k<5;k++){
for(n=0;n<=sig;n++){
if((t[i]+t[j]+t[k])*4 == val[n]){
//printf("2->i:%d j:%d k:%d\n",i,j,k);
printf("result:%d\n",val[n]);
}
}
}
}
}
return 0;
}
运行结果是24升。
结束。