動態規劃題,隱式二維費用揹包,設s[i]表示輸入的郵票面值,d[k]表示貼出k郵資所須要的郵票的最少張數。因而動態轉移方程:d[j+s[i]]=min{d[j+s[i]],d[j]+1}。對j:0~mm*m,i:0~n-1,求每一對組合(j,i)決定的d[j+s[i]]的最小值,最後d[k]的值就是貼出k郵資所需郵票數量的最小值。注意初始化,除了d[0]=0,其餘都初始化爲10000。ios
/* ID:jzzlee1 PROB:stamps LANG:C++ */ //#include<iostream> #include<fstream> using namespace std; ifstream cin("stamps.in"); ofstream cout("stamps.out"); short d[2010000];int s[200]; int main() { int i,j,m,n,mm=0,ans=0; cin>>m>>n; for (i=0;i<n;++i) { cin>>s[i]; if(mm<s[i]) mm=s[i]; } for(i=1;i<=mm*m+3;++i) d[i]=10000; for (j=0;j<=mm*m;++j) for (i=0;i<n;++i) if(d[j]<m&&d[j+s[i]]>1+d[j]) d[j+s[i]]=1+d[j]; while (d[ans+1]<=m) ++ans; cout<<ans<<endl; return 0; }