整数拆分问题 原创
算法标签 动态规划
题目

思路
数据N尽量拆分!
最大不超过K
1.初始化
2.K>N 答案与f(K,N)相同
3.K=N 答案是F(K,N-1)+1 等于上一个答案拆分出来一个
4.k<N 答案是F(i-j,j)/包含J的情况/ +F(i,j-1)/所有数据都小于J的情况/
代码
#include<iostream>
using namespace std;
int n,k;
const int N=110;
int dp[N][N];
int getAns(int n,int k){
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
if(i==1||j==1)dp[i][j]=1;
else if(i<j)dp[i][j]=dp[i][i];
else if(i==j)dp[i][j]=dp[i][j-1]+1;
else if(i>j)dp[i][j]=dp[i-j][j]+dp[i][j-1];
return dp[n][k];
}
int main(){
cin>>n>>k;
cout<<getAns(n,k);
return 0;
}
方法二
1.需要拆分的数据必然比拆分的数据更大 所以J>=I
2.可拆分的数据等于所有拆分掉自身可拆分数据的数据价值的累加
#include<iostream>
#include<vector>
using namespace std;
int tn,tk;
int main(){
cin>>tn>>tk;
auto func = [](int n,int k) -> int {
vector<int> a(n+1,0);
a[0]=1;//初始化
for(int i=1;i<=tk;i++) //可能拆分的值
for(int j=i;j<=tn;j++) //被拆分数据
a[j]+=a[j-i];
return a[tn];
};
cout<<func(tn,tk);
return 0;
}
输出


浙公网安备 33010602011771号