1. 程式人生 > >vijos 1117 數的劃分(整數拆分)

vijos 1117 數的劃分(整數拆分)

將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。

例如:n=7,k=3,下面三種分法被認為是相同的。

1,1,5; 1,5,1; 5,1,1;
問有多少種不同的分法。

dp:


剩下的j分i份,最大的那份為k

#include<bits/stdc++.h>
using namespace std;
int f[10][201][201];

int main(){
    int n,ans=0,m;
    cin>>n>>m;
    f[0][0][0]=1;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=j;k++)
                for(int l=0;l<=k;l++)
                    f[i][j][k]+=f[i-1][j-k][l];
    for(int i=1;i<=n;i++)
        ans+=f[m][n][i];
    cout<<ans<<endl;
    return 0;
}

2.


#include<bits/stdc++.h>
using namespace std;
int g[505][505];

int main(){
    int n,k,m;
    cin>>m>>k;
    for(int i=0;i<m;i++)
        g[i][0]=1;
    for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++)
            if(j>=i)
                g[i][j]=g[i][j-i]+g[i-1][j];
            else
                g[i][j]=g[i-1][j];
    cout<<g[k][m-k]<<endl;
    return 0;
}

3.類似poj 1664 分蘋果分法:

//7分3拆為6分2(最小數為1)和4分3(最小數不為1,每份去掉一個1再分)
#include<bits/stdc++.h>
using namespace std;
int dp[505][505];

int main(){
    int n,ans=0,m;
    cin>>n>>m;
    dp[1][1]=1;
    for(int i=2;i<=n;i++)
        for(int j=1;j<=m;j++)
        if(i>=j)
            dp[i][j]=dp[i-1][j-1]+dp[i-j][j];
    cout<<dp[n][m]<<endl;
    return 0;
}