1 条题解
-
0
#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
- 上传者