FOJ 1207 半数集问题

思想为递归的思想。

注意半数集不是多重集。集合中已经有的元素不再添加到集合中。

 

必须注意重复问题!

由于0<n<201所以0<n/2<=100

故可能产生重复的是一个2位数

例如30->1230和30->230->1230相同。

或者60-(添加24)>2460-(添加1)>12460和60-(添加4)>460-(添加2)>2460-(添加1)>12460

在一位数y=x%10的半数集中已经产生。

这样就必须剔除重复的元素。

那么判断的条件就是i>10&&(i/10<=(i%10)/2)

#include <stdio.h> #include <string.h> long halfset(int n,int *a) { long k=1; long i; //如果已经求出此数的半数集,则直接返回 if (a[n]>0) return a[n]; for (i=1;i<=n/2;i++){ k+=halfset(i,a); if (i>10&&(i/10<=((i%10)/2)) { k-=a[i/10]; } } a[n] = k; return k; } int main() { int n; int a[300]; memset(a, 0, sizeof(a)); while (scanf("%d", &n)!=EOF) printf("%d/n", halfset(n,a)); return 0; }

你可能感兴趣的:(FOJ 1207 半数集问题)