第一:
将一个整数 n 划分为 不超过m 组 的划分数 如
n=4
m=3
输出:
4 { 1+1+2=1+3=2+2=4}
思路:使用动态规划: 定义状态:
dp[i][j] j的i划分的组数
递推:dp[i][j]=dp[i][j-i]+dp[i-1][j] ------当m=n时,变成了常见的整数划分问题
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1000+10;
int dp[maxn][maxn],n,m;
void sovle(){
dp[0][0]=1;
for(int i=1;i<=m;i++){
for(int j=0;j<=n;j++){
if(j-i>=0){
dp[i][j]=dp[i][j-i]+dp[i-1][j];
}
else dp[i][j]=dp[i-1][j];
}
}
}
int main()
{
memset(dp,0,sizeof(dp));
n=4;m=4;
sovle();
cout<<dp[m][n]<<endl;
}