算法 连续邮资问题
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; }
相关文章推荐