1 条题解

  • 0
    @ 2026-1-28 14:52:42
    #include<bits/stdc++.h>
    using namespace std;
    // [1] arr:存储每种货币的面值;dp:动态规划数组,dp[j]表示凑成j元的方案数
    int arr[200];
    long long dp[5100]={};
    
    int main(){
        int n,m; // [2] n:货币的种类数;m:需要凑的目标金额
        cin>>n>>m; 
        // [3] 读取n种货币的面值,存入数组arr
        for(int i=0;i<n;i++) cin>>arr[i];
    
        // [4] 初始化dp数组:凑0元只有1种方案(不选任何货币)
        dp[0]=1;
    
        // [5] 完全背包核心逻辑:遍历每种货币,更新凑不同金额的方案数
        for(int i=0;i<n;i++){
            // 正序遍历金额,保证每种货币可以被多次选取(完全背包特性)
            for(int j=arr[i];j<=m;j++){
                // 递推式:凑j元的方案数 += 凑j-arr[i]元的方案数(新增当前货币的选取)
                dp[j]+=dp[j-arr[i]];
            }
        }
    
        // [6] 输出凑成m元的总方案数
        cout<<dp[m];
        return 0;
    }
    
    • 1

    信息

    ID
    1332
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者