一个数可以被分解成几个数和的形式:
利用动态规划求解:根据不同要求做相应的改变,注意高精度的处理
for(int i=0;i<=N:i++)
for(int j=i;j<=N;j++)
dp[j]+=dp[j-i];
hdu1028: 求解一个数可以被分解多个数和的形式,这种情况有几种?
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
using namespace std;
long long dp[220];
void fun()
{
dp[0]=1;
for(int i=1; i<=120; i++)
for(int j=i; j<=120; j++)
dp[j]+=dp[j-i];
}
int main()
{
int t,M,N;
fun();
while(scanf("%d",&M)!=EOF)
{
printf("%lld\n",dp[M]);
}
return 0;
}
poj1664:放苹果,数据比较水
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
using namespace std;
int dp[20];
int fun(int M,int N)
{
dp[0]=1;
for(int i=1;i<=N;i++)
for(int j=i;j<=M;j++)
dp[j]+=dp[j-i];
return dp[M];
}
int main()
{
int t,M,N;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&M,&N);
printf("%d\n",fun(M,N));
memset(dp,0,sizeof(dp));
}
return 0;
}
poj3181: 该题需要高精度
#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
long long dp[1111];//存的是高位
long long dp1[1111];//存的是低位
const long long inf=1000000000000000000LL;
void init(int n,int m)
{
dp1[0]=1;
for(int i=1; i<=m; i++)
for(int j=i; j<=n; j++)
{
dp[j]=dp[j]+dp[j-i]+(dp1[j]+dp1[j-i])/inf;
dp1[j]=(dp1[j]+dp1[j-i])%inf;
}
}
int main()
{
int N,K;
while(scanf("%d%d",&N,&K)!=EOF)
{
init(N,K);
if(dp[N]==0)
printf("%lld\n",dp1[N]);
else
printf("%lld%018lld\n",dp[N],dp1[N]);
memset(dp1,0,sizeof(dp1));
memset(dp,0,sizeof(dp));
}
return 0;
}