900正の除算(DPを数える)

トピック

ここに画像の説明を挿入します

解決策1

完全なナップザック解:状態方程式をf [i] [j]として設定します。これは、合計がjである解の数のみが1-iから選択されることを意味します。

ここに画像の説明を挿入します

コード1

#include<bits/stdc++.h>

using namespace std;
const int N = 1100;
const int mod = 1e9 + 7;

int n;
int f[N];

int main() {
    
    

    cin >> n;

    f[0] = 1;  总和等于0的方案有1种
    for (int i = 1; i <= n; i++) {
    
    
        for (int j = i; j <= n; j++) {
    
    
            f[j] = (f[j] + f[j - i]) % mod;
        }
    }

    cout << f[n] << endl;

    return 0;
}

解決策2

ここに画像の説明を挿入します
ここではもっと魔法のようです。セットを最小値1のjに分割すると、合計はi-1になり、j-1の数はf [i-1] [j-1]の表現になり、セットの残りの半分は、要素種の各数から1を引くと、合計はi-1 * jであり、数はjであり、方程式はf [ij] [j]であるため、f [i] [j ] = f [i-1] [j-1] + f [ij] [j]

コード2

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>


using namespace std;
typedef long long ll;
const int N=1100;
const int mod=1e9+7;


int n;
int f[N][N]; //表示和为i的数组成的个数有j个 

int main(){
    
    


    cin>>n;

    f[1][1]=1;

    for(int i=2;i<=n;i++){
    
    
        for(int j=1;j<=i;j++){
    
    
            f[i][j]=(f[i-1][j-1]+f[i-j][j])%mod;
        }
    }

    ll res=0;

    for(int i=1;i<=n;i++){
    
    
        res=(res+f[n][i])%mod;
    }

    cout<<res<<endl;

    return 0;
}

おすすめ

転載: blog.csdn.net/qq_44791484/article/details/114939109