问题描述:
假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。 例如当n=5,m=4时,面值为1,3,11,15,32的5种邮票可以贴出邮资的最大连续区间是1到70。
直接上代码:
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int N = 5;
int M = 6;
int mz[N]={1,7,12,43,52};
int a[M*mz[N-1]+1]={0};//a数组用来记录下标i最少需要a[i]张邮票
a[1] = 1;
for(int i = 2; i <= M*mz[N-1]+1; i++){
int t = M+1;
for(int j = N-1; j >= 1; j--){
if(i%mz[j]==0){
t = i/mz[j];
break;
}
}
for(int k = 0; k < N; k++){
if(i-mz[k]>0) t = min(t,a[i-mz[k]]+1);
else break;
}
a[i] = t;
if(a[i]>M){
cout<<"最大邮资为"<<i-1<<endl;
break;
}
}
system("pause");
return 0;
}
传一个时间复杂度是O(n)的解法,不想写注释将就着看吧