半数集:多重集
http://115.28.203.224/problem.php?id=1176
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1005];
int HalfSet(int n)
{
if(a[n] > 0)
return a[n];
else
{
a[n] = 1;
for(int i = 1;i <= n/2;i++)
a[n] += HalfSet(i);
return a[n];
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
printf("%d\n",HalfSet(n));
}
return 0;
}
半数单集:非单重集
http://acm.fzu.edu.cn/problem.php?pid=1207
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1005];
int HalfSet(int n)
{
if(a[n] > 0)
return a[n];
else
{
a[n] = 1;
for(int i = 1;i <= n/2;i++)
{
a[n] += HalfSet(i);
if (i>10&&(i/10<=((i%10)/2)))
{
a[n] -= a[i/10];
}
}
return a[n];
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
printf("%d\n",HalfSet(n));
}
return 0;
}