整数求和【01背包】

版本1

  • 题目链接
  • 转移方程
    • dp[i][j] = dp[i-1][j] + dp[i-1][j-i]
  • 初始化
    • 值为0时,有一种方案
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 128;
int a[N];
int dp[N][N];
int main(){
    
    
    int n, m;
    scanf("%d %d", &n, &m);
    memset(a, 0, sizeof a);
    memset(dp, 0, sizeof dp);
    for(int i = 0; i <= n; i++) dp[i][0] = 1;
    for(int i = 1; i <= n; i++){
    
    
        for(int j = 0; j <= m; j++){
    
    
            if(j >= i) dp[i][j] = dp[i-1][j] + dp[i-1][j-i];
            else dp[i][j] = dp[i-1][j];
        }
    }
    printf("%d", dp[n][m]);
}

版本2

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
const int N = 128;
int a[N];
int dp[N];
int main(){
    
    
    int n, m;
    scanf("%d %d", &n, &m);
    memset(a, 0, sizeof a);
    memset(dp, 0, sizeof dp);
    dp[0] = 1;
    for(int i = 1; i <= n; i++){
    
    
        for(int j = m; j >= i; j--){
    
    
            dp[j] = dp[j-i] + dp[j];
        }
    }
    printf("%d", dp[m]);
}

Guess you like

Origin blog.csdn.net/SYaoJun/article/details/117514422