问题描述:
假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。连续邮资问题要求对于给定的n和m,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。 例如当n=5,m=4时, 面值为1,3,11,15,32的5种邮票可以贴出邮资的最大连续区间是1到70。
算法思想:
因为每张信封上贴的邮票数不固定,所以添加面值为0的邮票使张数固定。
用深度优先搜索的方法,找出所有可行解,并循环判断是否连续,不连续即终止循环,此时即为最大连续
#include<stdio.h>
int n,m;
int a[100];
int temp,flag;
void dfs(int step,int money)
{
if(step==m)
{
if(temp==money)
flag=1;
return;
}
for(int i=0; i<=n; i++)
{
temp+=a[i];
if(temp<=money)
dfs(step+1,money);
temp-=a[i];
}
}
int main()
{
a[0]=0;
while(~scanf("%d %d",&n,&m))
{
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
int j=0;
while(1)
{
flag=0;
temp=0;
dfs(0,j);
if(flag)
j++;
else
break;
}
printf("%d\n",j-1);///因为最后一次不满足条件才跳出所以j-1次是最大连续
}
return 0;
}