http://acm.njupt.edu.cn/acmhome/problemdetail.do;jsessionid=C5F74A298747B3520DE77A677A8E057F?&method=showdetail&id=1221
/********************************************************************<br /> ** @file test.cpp<br /> ** @author liuke<br /> ** @date Fri Apr 22 23:50:50 2011<br /> ** @brief<br /> **************************動態規劃實現********************************<br /> 長度為m的數組f[1...m]中存放一系列子結果,即f[i]為要湊的錢數為i時<br /> 所需的最少硬幣數,則c[m]為所求;<br /> 當要找的錢數i(1<i<m)與當前所試探的硬幣面值k相等時,結果為1,即c[i]=1<br /> 當i大於當前所試探硬幣面值k時,若f[i]為0,即還未賦過值,且c[i-k]不為0,<br /> 即從i元錢中刨去k元後剩下的錢數可以找開, 則c[i]=c[i-k]+1<br /> 若f[i]不為0,即已賦過值,則f[i]為f[i-k]+1和f[i]中較小的<br /> **<br /> **@version Copyright (c) 2010,河南理工大學-信管08-三班<br /> *******************************************************************/<br /> #include<iostream><br /> #include<cstring><br /> using namespace std;<br /> #define MAX 20002<br /> #define INF 9999999<br /> struct node{<br /> int m,num;<br /> }a[11];int n,f[MAX];int money;<br /> void init(){<br /> int i;cin>>n;<br /> for(i=0;i<n;++i){<br /> cin>>a[i].m>>a[i].num;<br /> }cin>>money;<br /> }<br /> int main(int argc, char *argv[])<br /> {<br /> init();<br /> for(int i=0;i<=money;++i)<br /> f[i]=INF;<br /> f[0]=0;<br /> for(int i=0;i<n;++i){<br /> for(int j=1;j<=a[i].num;++j){<br /> for(int k=money;k>=a[i].m;--k)<br /> f[k]=min(f[k],f[k-a[i].m]+1);<br /> }<br /> }<br /> if(f[money]!=INF)cout<<f[money]<<endl;<br /> else cout<<"-1"<<endl;<br /> return 0;<br /> }