邮票封面设计问题

/*问题描述:给定一个信封,最多只允许贴   N张邮票,计算在给定K(N+K<=40)   种邮票的情况下
(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max,使得1__max之间的每一个
邮资值都能得到。  
  例如:N=3,K=2,如果面值分别为1分、4分,则在1分__6分之间的每一个邮资值都能得到
  (当然还有8分、9分、和12分):如果面值分别为1分、3分则在1分--7分之间的每一个邮资值都能得到。
  可以验证当N=3,K=2时,7分就是可以得到的连续的邮资最大   值,所以max=7,面值分别为1分、3分。
*/ 

55555,似乎效率不高.............

  1. #include<iostream>
  2. using namespace std;
  3. #define N 3
  4. #define K 2
  5. int RStamp_Com[K];/*存储最优邮票组合*/
  6. int Stamp_Com[K];/*K种邮票的组合*/
  7. int Stamp[N];/*临时票面组合*/
  8. int Value[1000];/*可能的邮资值*/
  9. int max;
  10. int main(){
  11.     void Select_Com(int value,int n);/*生成一种邮票面值组合*/
  12.  cout<<"信封最多允许贴"<<N<<"张邮票!"<<endl;
  13.  cout<<"邮票的面值数为"<<K<<endl;
  14.  max=0;/*初始化最大邮资值*/
  15.     Stamp_Com[0]=1;/*第一个邮票面值肯定要为1*/
  16.  Select_Com(1,1);
  17.  cout<<"则邮票票面值应该为:"<<endl;
  18.  for(int i=0;i<K;i++)cout<<RStamp_Com[i]<<endl;
  19.  cout<<"在此邮票组合下连续的最大邮资可达:"<<max<<endl;
  20.  return 0;
  21. }
  22. void VALUE(int & count,int n,int sum){
  23.  if(n==N)return;
  24.  else{
  25.   for(int i=0;i<K;i++){
  26.    sum+=Stamp_Com[i];
  27.    bool HAD=false;
  28.    for(int j=0;j<=count;j++)if(Value[j]==sum){HAD=true;break;}
  29.    if(!HAD){Value[count++]=sum;}
  30.    VALUE(count,n+1,sum);
  31.    sum-=Stamp_Com[i];
  32.    VALUE(count,n+1,sum);
  33.   }
  34.  }
  35. }
  36. void Select_Com(int value,int n){
  37.     if(n==K){/*选择了一个面值组合*/
  38.         /*利用这个面值组合求所有可能的邮资取值*/
  39.   for(int i=0;i<1000;i++)Value[i]=-1;
  40.   int count=0;//计数多少种邮资值
  41.   VALUE(count,0,0);//形成所有邮资值
  42.      int temp_max=0;
  43.   bool temp;
  44.   do{
  45.    temp=false;
  46.    for(int i=0;i<count;i++)if(Value[i]==temp_max+1){
  47.     temp=true;temp_max++;
  48.    }
  49.   }while(temp);//可能的最大邮资
  50.         if(temp_max>max){
  51.    max=temp_max;//修改max
  52.    for(int k=0;k<K;k++)RStamp_Com[k]=Stamp_Com[k];
  53.   }
  54.   return;
  55.  }
  56.  else{
  57.   for(int v=2;v<=2*N*K;v++){/*面值,这里v的最大取值存在疑问*/
  58.    if(v>value){
  59.     Stamp_Com[n]=v;
  60.     Select_Com(v,n+1);
  61.    }
  62.   }
  63.  }
  64. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值