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("
");
		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;
}

  

原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/6866128.html