1 条题解

  • 0
    @ 2025-8-24 21:42:11

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar sgl654321
    风起雨停,天又放晴

    搬运于2025-08-24 21:42:11,当前版本为作者最后更新于2023-03-18 15:48:53,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目描述

    nn 种纸币,要想凑出 ww 的面值,至少要几张纸币?

    解题思路

    一眼 dp 题。dp 题的解题思路通常为:读懂题意,设计状态,确定目标态和初始态,思考转移方程,思考优化。

    设计状态:f[i]f[i] 表示凑出面值为 ii 至少需要的纸币张数。

    目标态:f[w]f[w];初始态:f[0]=0f[0]=0,因为凑出 00 元一张纸币都不需要。

    转移方程:f[v]=min{f[va[i]]}+1(i[1,n])f[v]=\min\{f[v-a[i]]\}+1(i\in[1,n])

    这是因为如果 va[i]v-a[i] 需要用 xx 张纸币,那么只需要加上 a[i]a[i] 这一张纸币,就能用这 x+1x+1 张凑出 vv 了。

    复杂度 O(nw)O(nw),因此不需要优化。

    参考代码

    注意:由于涉及到取 min\min 操作,所以必须将初始值设为一个极大值。

    #include<bits/stdc++.h>
    using namespace std;
    long long n,w,a[1010],f[100010];
    int main(){
    	cin>>n>>w;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<=10010;i++)f[i]=1145141919;
    	for(int i=1;i<=n;i++)
    		for(int j=a[i];j<=w;j++)
    			f[j]=min(f[j],f[j-a[i]]+1);
    	cout<<f[w]<<endl;
    	return 0;
    } 
    
    • 1

    信息

    ID
    8496
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者