您的位置:首页 > 编程语言 > C语言/C++

算法 连续邮资问题

2016-12-22 21:56 411 查看

题目

假设某国家发行了n种不同面值的邮票,并且规定每张信封上最多只允许贴m张邮票。

连续邮箱问题要求:对于给定的n和m,给出邮票面值的最佳设计,在1张信封上贴出从邮资1开始,增量为1的最大连续邮资区间。

例如:当n=5,m=4时,面值为1,3,11,15,32的5种邮票可以贴出邮资的最大连续区间是1到70。

#include<stdio.h>
#define n 5//邮票种数
#define m 4//最多可贴张数

int price[n+1]={0,1,3,11,15,32};//面值,注意0
int maxValue=0;//连续值最大
int sum=0;//连续值
int money;//回溯出的面值
int flag=0;

void dfs(int t){//回溯凑齐money的可能性,可能flag==1,反之为0
if(flag){
return ;
}
if(t==m){//贴m张
if(sum==money){//sum 和 贴的钱相比较,有方案flag==1
maxValue=money;
flag=1;
}
return;
}
for(int i=0; i<=n; i++){//面值
money+=price[i];
if(t<=m)
dfs(t+1);
money-=price[i];
}
}
int main(){
while(true){
flag=0;
dfs(0);
sum++;//每次sum++,所以是连续的
if(flag==0)
//随着sum++,如果flag==0,则没有回溯出方案,就不连续了,退出循环
break;
}
printf("%d\n", maxValue);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息