题目:小明同学想用一百钱买一百只鸡,公鸡五钱一只,母鸡三钱一只,小鸡一钱三只,问:有多少种买法?
思路1:暴力枚举
由于小鸡一钱三只,故我们每次买鸡时称份:
公鸡五钱一份,一份一只
母鸡三钱一份,一份一只
小鸡一钱一份,一份三只
代码:
#include <stdio.h>
int main()
{
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100; j++) {
if ( i+j>100 )
break;
for (int k = 0; k <= 100; k++) {
if ( i+j+3*k==100 && 5*i+3*j+k==100) {
printf("%d %d %d\n",i,j,3*k);
break;
}
}
}
}
return 0;
}
优化:
#include <stdio.h>
int main()
{
for (int i = 0; i <= 100; i++) {
for (int j = 0; j <= 100 - i; j++) {
int k = 0;
if ( i+j==100 || (100-i-j)%3==0 ) {
k = (100-i-j)/3;
if ( 5*i+3*j+k==100 )
printf("%d %d %d\n",i,j,3*k);
}
}
}
return 0;
}
思路二:贪心
具体思路:
1.尽可能买多的公鸡
2.富余的钱尽可能买多的母鸡
3.剩下的钱买小鸡
4.判断鸡的总数是否为100
5.母鸡数量减一
6.重复2345
Tips:当鸡的总数大于100时,进行7
7.母鸡数量为0时,公鸡数量减一
8.重复23456
代码:
#include <stdio.h>
struct chicken {
int price;
int num;
}
int main()
{
int chick;
struct chicken cock,hen;
cock.price = 5;
hen.price = 3;
cock.num = 100 / cock.price;
hen.num = (100 - cock.num*cock.price) / hen.price;
chick = (100 - cock.num*cock.price - hen.num*hen.price)*3;
if ( cock.num+hen.num+chick == 100 )
printf("%d %d %d\n",cock.num,hen.num,chick);
hen.num--;
while (cock.num >= 0) {
while (hen.num >= 0) {
chick = (100 - cock.num*cock.price - hen.num*hen.price)*3;
if ( cock.num+hen.num+chick == 100 )
printf("%d %d %d\n",cock.num,hen.num,chick);
if ( cock.num+hen.num+chick > 100 )
break;
hen.num--;
}
cock.num--;
hen.num = (100 - cock.num*cock.price) / hen.price;
}
return 0;
}