dp-硬币

假设您是个土豪,身上带了足够的1、5、10、20、50、100元面值的钞票。现在您的目标是凑出某个金额w,需要用到尽量少的钞票。

  依据生活经验,我们显然可以采取这样的策略:能用100的就尽量用100的,否则尽量用50的……依次类推。在这种策略下,666=6×100+1×50+1×10+1×5+1×1,共使用了10张钞票。

  这种策略称为“贪心”:假设我们面对的局面是“需要凑出w”,贪心策略会尽快让w变得更小。能让w少100就尽量让它少100,这样我们接下来面对的局面就是凑出w-100。长期的生活经验表明,贪心策略是正确的。

  但是,如果我们换一组钞票的面值,贪心策略就也许不成立了。如果一个奇葩国家的钞票面额分别是1、5、11,那么我们在凑出15的时候,



作者:阮行止
链接:https://www.zhihu.com/question/23995189/answer/613096905
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 
8知道路径记录那一块有没有错
#include<iostream>
#include<cstdio>

using namespace std;

const int INF=0x3f3f3f3f;

int main(){
    int f[105],i,n,cost,pos[105];
    scanf("%d",&n);
    
    f[0]=0;
    pos[0]=0;
    for(i=1;i<=n;i++){
        cost=INF;
        if(i-1>=0){
            cost=min(cost,f[i-1]+1);
            if(cost==f[i-1]+1){
                pos[i]=    i-1;
            }    
        }
        if(i-5>=0) {
            cost=min(cost,f[i-5]+1);
            if(cost==f[i-5]+1){
                pos[i]=    i-5;
            }
        }
        if(i-11>=0){
            cost=min(cost,f[i-11]+1);
            if(cost==f[i-11]+1){
                pos[i]=    i-11;
            }
        } 
        f[i]=cost;
    }
    printf("%d\n",f[n]);
    
    for(i=n;i>=1;){
        if(i-pos[i]==1){
            printf(" 1 ");
            i=i-1;
        }else if(i-pos[i]==5){
            printf(" 5 ");
            i=i-5;
        }else if(i-pos[i]==11){
            printf(" 11 ");
            i=i-11;
        }
    }
    return 0;
}

 

posted on 2020-10-07 13:23  Taurus20000519  阅读(114)  评论(0)    收藏  举报