题解 | #最小邮票数#

最小邮票数

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

用没有状态压缩的二维数组来动态规划
第i行考虑加入第i张邮票
第j列考虑目标面值为j
用结构体存每个位置凑出的最接近j的面值price和所需的最小张数num
最后看dp[N][M].price是否等于M,输出其num即可
比较烦人的是状态转移

#include<iostream>

using namespace std;

struct node {
    int price;
    int num;
};
int main(){
    
    int M,N;
    int value[21];
    value[0]=0;
    node dp[20][100];
    node n;
    n.price = 0;
    n.num = 0;
    for(int i=0;i<100;i++) dp[0][i] = n;
    for(int i=0;i<20;i++) dp[i][0] = n;
    
    while(cin>>M>>N){
        for(int i=1;i<=N;i++){
            cin>>value[i];
        }
        for(int i=1;i<=N;i++){
            for(int price=1;price<=M;price++){
                node doNothing = dp[i-1][price];
                
                    node last = dp[i-1][price-value[i]];
                    node selectIt;
                    selectIt.num = last.num+1;
                    selectIt.price = last.price+value[i];
                    if(selectIt.price<=price){
                        if(price-selectIt.price<price-doNothing.price){//选择以后更接近j,则选择
                            dp[i][price] = selectIt;
                        } else if(price-selectIt.price>price-doNothing.price){//否则不选
                            dp[i][price] = doNothing;
                        } else if(selectIt.num<doNothing.num){//如果选不选price都一样,则选num更小的
                            dp[i][price] = selectIt;
                        } else {
                            dp[i][price] = doNothing;
                        }
                    } else {
                        dp[i][price] = doNothing;
                    }
                
            }
        }
        int num = dp[N][M].num;
        if(dp[N][M].price==M){
            cout<<dp[N][M].num<<endl;
        } else {
            cout<<0<<endl;
        }
    }
    
    return 0;
}


全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 11:31
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-23 20:31
已编辑
武汉大学 Java
内向的柠檬精在研究求...:注意把武大标粗标大 本地你俩不是乱杀
实习进度记录
点赞 评论 收藏
分享
07-11 15:12
门头沟学院 Java
别人在上班,我就在工位上看看视频啥的,这正常吗?
程序员小白条:实习就是摸鱼,只是公司指标,把你进来了,可能那时候客户很多,但等你进来的时候,已经是淡季了,根本没多少需求,或者说根本不适合实习生去完成,因此你就每天干坐着就行,可能1,2个月都没需求
实习生的蛐蛐区
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务