2016蓝桥杯决赛C/C++A组第三题 打靶
题意:
小明参加X星球的打靶比赛。
比赛使用电子感应计分系统。其中有一局,小明得了96分。
这局小明共打了6发子弹,没有脱靶。
但望远镜看过去,只有3个弹孔。
显然,有些子弹准确地穿过了前边的弹孔。
不同环数得分是这样设置的:
1,2,3,5,10,20,25,50
那么小明的6发子弹得分都是多少呢?有哪些可能情况呢?
分析:
#include <stdio.h> #define N 8 void f(int ta[], int da[], int k, int ho, int bu, int sc) {//ta[i]--环数i得分,da[i]--打中环数i的子弹数,k--环数id,ho--弹孔数,bu--子弹个数,sc--得分 int i,j; if(ho<0 || bu<0 || sc<0) return; if(k==N){ if(ho>0 || bu>0 || sc>0) return; for(i=0; i<N; i++){ for(j=0; j<da[i]; j++) printf("%d ", ta[i]); } printf("\n"); return; } for(i=0; i<=bu; i++){//枚举环数k上可能打中的子弹个数,若打中个数为0,则不造成弹孔 da[k] = i; f(ta, da, k+1,(i == 0) ? ho : ho - 1 , bu-i, sc-ta[k]*i); //填空位置 } da[k] = 0; } int main() { int ta[] = {1,2,3,5,10,20,25,50}; int da[N]; f(ta, da, 0, 3, 6, 96); return 0; }