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; }
浙公网安备 33010602011771号