社区讨论

P2842题解

P2842纸币问题 1参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mkp3xofx
此快照首次捕获于
2026/01/22 15:05
4 周前
此快照最后确认于
2026/01/22 15:14
4 周前
查看原帖

经典动态规划

题目分析:

给出n张纸币,要求用最少的张数凑出w金额。此时局部最优解未必是全局最优解比如w=15,有三张纸币对应金额分别是1,5,11。此时应该用动态规划从0推到w的答案。
代码:
CPP
#include<iostream>
#include<vector>
#include<algorithm>
#include <climits>
using namespace std;
int main()
{
    int n,w;
    cin>>n>>w;
    vector<int> a(n);
    for(int &c:a) cin>>c;
    vector<int> dp(w+1,INT_MAX);//表示不同金额时的最小张数
    dp[0]=0;
    for(int num:a)
    {
        for(int j=num;j<=w;j++)
        {
            if(dp[j-num]!=INT_MAX) dp[j]=min(dp[j],dp[j-num]+1);
        }
    }
    cout<<dp[w]<<endl;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...