#include <iostream> #include <stdio.h> #include <cstring> using namespace std; int dp[100]; int n,k; //分成不同任意正整数之和 void fa(int n,int k) { memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=k;i++) for(int j=i;j<=n;j++) dp[j]+=dp[j-i]; printf("%d\n",dp[n]); } //k种划分 int fb(int n,int k) { if(n==0) return 0; if(k==1) return 1; if(n<k) return 0; return fb(n-k,k)+fb(n-1,k-1); } //划分成不同的正奇数 void fd(int n,int k) { memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i+=2) for(int j=i;j<=n;j++) dp[j]+=dp[j-i]; printf("%d\n",dp[n]); } //划分成不同的正整数 void fe(int n,int k) { memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=n;i++) for(int j=n;j>=i;j--) dp[j]+=dp[j-i]; printf("%d\n",dp[n]); } int main() { while(scanf("%d%d",&n,&k)==2) { //分成不同任意正整数之和 fa(n,n); //k种划分 printf("%d\n",fb(n,k)); //划分成不同的正整数 fa(n,k); //划分成不同的正奇数 fd(n,n); //划分成不同的正整数 fe(n,n); printf("\n"); } return 0; }
hoj 整数划分问题 经典dp
最新推荐文章于 2019-07-07 04:49:19 发布