日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

连续邮资问题

發布時間:2024/9/30 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 连续邮资问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
class Stamp {friend int MaxStamp(int, int, int[]); private:void BackTrack(int i, int r);int n, //郵票面值數m, //每張信封最多允許貼的郵票數maxvalue, //當前最優值maxint, //大整數maxl, //郵資上界*x, //當前解*y, //貼出各種郵資所需最少郵票數*bestx; //當前最優解 };void Stamp::BackTrack(int i, int r) {//當前的郵票是x[i],r是x[1- i-1]郵票所能表示的最大的連續上界int j;int k;for(int j=0; j<=x[i]*(m-1); j++)if(y[j]<m)for(int k=1; k<=m-y[j];k++)if(y[j]+k<y[j+x[i]*k]) y[j+x[i]*k]=y[j]+k;while(y[r]<maxint) r++;//求得x[1-i]的郵票所能表示的最大連續上界--r;if(i>=n){if(r>maxvalue){maxvalue=r;for(int j=1;j<=n;j++)bestx[j]=x[j];}return;}int *z=new int [maxl+1];for(int k=1;k<=maxl;k++)z[k]=y[k];for(j=x[i]+1;j<=r+1;j++)//下一個區間的取值范圍從[r+1,...],所以必須保證有值能取到r+1,因為這個區間能取到的最大連續值是r{if (y[r+1 - j] < m){x[i+1]=j;BackTrack(i+1,r);//r代表當前區間能取到的最大連續值for(k=1;k<=maxl;k++)y[k]=z[k];}}delete [] z; }int MaxStamp(int n, int m, int bestx[]) {int i;Stamp X;int maxint=32767;int maxl=1500;X.n=n;X.m=m;X.maxvalue=0;X.maxint=maxint;X.maxl=maxl;X.bestx=bestx;X.x=new int [n+1];X.y=new int [maxl+1];for(int i=0;i<=n;i++)X.x[i]=0;for(i=1;i<=maxl;i++)X.y[i]=maxint;X.x[1]=1;X.y[0]=0;X.BackTrack(1,0);//這樣取值比王曉東書上的更好理解了,0前一個區間能取到的最大連續值是0,這是因為前一個區間沒有任何郵票的面值delete [] X.x;delete [] X.y;return X.maxvalue; }int main() {int n,m;// cout<<"請輸入郵票面值數(n)和每張信封最多允許貼出的郵票數(m):";while(scanf("%d%d",&n,&m)){int *bestx=new int [n+1];int maxvalue;maxvalue=MaxStamp(n,m,bestx);cout<<"最優解為: ";for(int i=1;i<=n;i++)cout<<bestx[i]<<" ";cout<<"\n"<<"最大連續郵資區間為:"<<maxvalue<<endl;}return 0; }

總結

以上是生活随笔為你收集整理的连续邮资问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。