连续邮资问题
假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。
连续邮箱问题要求对于给定的n和m,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。
例如当n=5,m=4时,面值为1,3,11,15,32的5种邮票可以贴出邮资的最大连续区间是1到70。
#include <stdio.h>
int a[6]={0,1,3,11,15,32}; //存放邮资面值
int b[500]={0}; //存放每一种情况的面值,存在此面值则设为1,否则为0
int count=0; //存放每一种情况面值的值
void backtrack(int t) //传值:取的邮票数目
{
int j;
if(t<5) //剪枝
{
for(j=0;j<6;j++)
{
count+=a[j];
if(t==4)
b[count]=1;
backtrack(t+1);
count-=a[j];
}
}
}
int main()
{
int i=1;
backtrack(1);
while(b[i]>0)
{
i++;
}
printf("%d\n",i-1);
return 0;
}
/*
思路:
因为要取得的邮票数目不固定,所以需要添加一个面值为0的邮票,然后循环回溯,取得每一种情况。
在主函数中遍历每一种邮资面值情况数组(b数组),判断连续最大区间。
回溯截止条件:取的邮票的数目为4。
*/