穷举每天杀猪数,若最后9天杀不完或提早杀完则证明无解。
利用递归完成:
#include <stdio.h>
//PIG头猪,分DAY天杀完,每天杀单数头
const int DAY=9
const int PIG=36
bool DFS(int day,int remain) //第day天剩下remain只猪,若最后能杀完则返回1,否则返回0
{
if(day>DAY) //如果DAY天已过,剩余0只返回1,即能杀完,否则返回0
return remain==0
int i
for(i=1i<=remaini+=2) //穷举第day天杀猪的头数i(i为奇数)
if(DFS(day+1,remain-i))//当第day+1天剩下remain-i头猪,而最后能杀完所有猪时,返回1
return 1
return 0 //若各种情况都不能则返回0
}
int main()
{
if(DFS(1,PIG)) //第一天剩下PIG头猪能否杀完
puts("有解")
else
puts("无解")
getchar()
return 0
}
二、推出数学关系式求解
设第i天杀ki头猪
则DAY天中共杀 k1+k2+k3+...+kDAY头猪
假设DAY天能杀完PIG头猪
则有 k1+k2+k3+...+kDAY==PIG (1)
因为每天杀奇数头猪,不妨设ki=2*pi+1 (pi>=0) (2)
则由(1)(2)得 PIG==2*(p1+p2+p3+...+pDAY)+DAY
显然如果等式成立,则PIG与DAY奇偶性相同
即
PIG%2==DAY%2
#include <stdio.h>
const int DAY=9
const int PIG=36
int main()
{
if(PIG%2==DAY%2)
puts("有解")
else
puts("无解")
getchar()
return 0
}