题目——传送
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[32768];
int main()
{
int i,j,n;
int val[3]= {1,2,3};
memset(dp,0,sizeof(dp));
dp[0] = 1;
for(i=0; i<3; i++)
{
for(j=val[i]; j<=32768; j++)
{
dp[j] = dp[j]+dp[j-val[i]];
}
}
while(~scanf("%d",&n))
{
printf("%d\n",dp[n]);
}
return 0;
}
数学方法也过
#include<stdio.h>
int main()
{
long i,n,sum,f;
while(scanf("%ld",&n)>0)
{
sum=0;
sum+=n/3; //计算n换成3、1的有多少种
sum++; //n全部换成1的
for(i=0;i<=n/3;i++)
{
f=(n-i*3)/2; //n换成2的有多少种,先是换出一个3,再是将剩下的2换成1,相加,得到结果,也不必担心重复计算的问题
sum+=f;
}
printf("%ld\n",sum);
}
return 0;
}