题目描述:
假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮箱问题要求对于给定的n和m,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。 例如当n=5,m=4时,面值为1,3,11,15,32的5种邮票可以贴出邮资的最大连续区间是1到70。
题目类型:回溯算法
最多可以贴m张邮票,所以回溯时traceback选择了贴第几张邮票
count从1开始
代码如下:
#include<stdio.h>
int n,m;
int a[100];
int count=1,sum=0;
int flag;
void traceback(int num)
{
int i;
if(flag)
return ;
if(num==m) {
if(sum==count) {
flag=1;
}
return ;
}
for(i=0;i<=n;i++) { //一共有n种邮票可选,但是还可以不贴
sum+=a[i];
traceback(num+1);
sum-=a[i];
}
}
int main()
{
int i;
scanf("%d%d",&n,&m);
a[0]=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
while(1) {
flag=0;
traceback(0);
if(flag==0) //第一次贴不出满足的邮票,终止
break;
count++;
}
printf("%d\n",count);
return 0;
}