整数拆分问题 原创

算法标签 动态规划

题目

在这里插入图片描述

思路

数据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;
}

输出

在这里插入图片描述

posted @ 2022-11-13 12:44  俺叫西西弗斯  阅读(0)  评论(0)    收藏  举报  来源