题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=90。
把一个整数拆分成的所有情况。
递归代码:
#include<iostream>
#include<stdio.h>
using namespace std;
int z[11];
int zh(int n,int m)
{
if(n==1||m==1)
return z[n]=1;
if(m==n)
return z[n]=(1+zh(n,m-1));
if(n<m)
return zh(n,n);
return zh(n,m-1)+zh(n-m,m);
}
int main()
{
zh(20,20);
int n;
cin>>n;
while(n--)
{
int m;
cin>>m;
printf("%d\n",z[m]);
}
}
最近在做动态规划的时候发现这个题目也可以用背包来些,并且比用递归喜恶简单的多。效率也高很多。
动态转移方程:dp[i]=dp[i]+dp[i-j];
代码如下:
#include<iostream>
#include<stdio.h>
#include <string.h>
using namespace std;
int main()
{
int T;cin>>T;
while(T--)
{
int n,m;
cin>>n;
int ans[21];
memset(ans,0,sizeof(ans));
ans[0]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i<=j)
ans[j]=ans[j]+ans[j-i];
cout<<ans[n]<<endl;
}
}