首页 > 其他 > 详细

基础DP(1)

时间:2021-01-24 00:50:45      阅读:36      评论:0      收藏:0      [点我收藏+]

硬币问题

n种硬币,面值v1,v2...vn,数量无限,输入s,使最少的硬币组合之和为s。(贪心解决的硬币问题使特殊面值,此处面对任意面值)

Min[i]是金额i对应的最少硬币数量,易得Min[i]=min(Min[i],Min[i-1]+1)。(如果面值是1的话)

从Min[i-1]到Min[i]的递推称为状态转移。

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int MONEY=251;
const int VALUE=5;
int type[VALUE]={1,5,10,25,50};
int Min[MONEY];
void solve(){
    for(int k=0;k<MONEY;k++){
        Min[k]=INT_MAX;
    }
    Min[0]=0;
    for(int j=0;j<VALUE;j++){
        for(int i=type[j];i<MONEY;i++){
            Min[i]=min(Min[i],Min[i-type[j]]+1);
        }
    }
}
int main()
{
    int s;
    solve();
    while(~scanf("%d",&s)){
        printf("%d\n",Min[s]);
    }
    return 0;
}

不行了,年轻人肾不好体谅一下,明天再来......

基础DP(1)

原文:https://www.cnblogs.com/Untergehen/p/14319571.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!