1. 程式人生 > 實用技巧 >900. 整數劃分(動態規劃)

900. 整數劃分(動態規劃)

方法一: 揹包模型

#include <bits/stdc++.h>
using namespace std;

const int N = 10010, mod = 1e9 + 7;
int dp[N][N];
int n;

int main() {
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) dp[i][0] = 1;
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            if(j >= i) {
                dp[i][j] 
= (dp[i-1][j] + dp[i][j-i]) % mod; } else { dp[i][j] = dp[i-1][j]; } } } printf("%d\n",dp[n][n]); return 0; }

方法二:

#include <bits/stdc++.h>
using namespace std;

const int N = 10010, mod = 1e9 + 7;
int dp[N][N];
int n;

int main() {
    scanf(
"%d",&n); // dp[i][j]:總數為i,分為j組的方案數 dp[0][0] = 1; for(int i = 1; i <= n; i++) { for(int j = 1; j <= i; j++) { // 兩種集合劃分 //有1 // 沒有1 dp[i][j] = (dp[i-1][j-1] + dp[i-j][j]) % mod; } } int res = 0; for
(int i = 1; i <= n; i++) res = (res + dp[n][i]) % mod; printf("%d\n",res); return 0; }