题解 | #最小邮票数#

最小邮票数

https://www.nowcoder.com/practice/83800ae3292b4256b7349ded5f178dd1

与0/1背包问题类似:
#include <iostream>
#include <vector>
#define MAXM 101
#define MAXN 21
#define MAX 99999
using namespace std;
int main(){
    //dp数组初始化
    int dp[MAXN][MAXM];
    for(int i=0;i<MAXN;i++){
        for(int j=0;j<MAXM;j++){
            dp[i][j]=MAX;
        }
    }
    for(int i=0;i<MAXN;i++)dp[i][0]=0;//当面额为0时,不需要邮票
    int M;//总值
    cin>>M;
    int N;//邮票数
    cin>>N;
    vector<int> stamps;//邮票的面值
    int stamp;
    for(int i=1;i<=N;i++){
        cin>>stamp;
        stamps.push_back(stamp);
    }
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){//考虑前i张邮票,总值为j
            if(stamps[i-1]<=j){//要么选,要么不选
                dp[i][j]=min(dp[i-1][j],dp[i-1][j-stamps[i-1]]+1);
            }
            else{//若当前面值大于总值,赋予用更小的面值凑成总值的结果。
                dp[i][j]=dp[i-1][j];
                continue;
            }
        }
    }
    if(dp[N][M]!=MAX){
        cout<<dp[N][M]<<endl;
    }
    else{
        cout<<0<<endl;
    }
    return 0;
}


全部评论

相关推荐

贺兰星辰:不要漏个人信息,除了简历模板不太好以外你这个个人简介是不是太夸大了...
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务