165Stamps(*****)推荐

来源:互联网 发布:晨曦软件正版多少钱 编辑:程序博客网 时间:2024/05/04 06:51
/*推荐题型:五星,题很不错,锻炼思维。想到了要进行两次递归搜索,一次选值,一次判断。但是选值时会出现问题,因为无法知道上届。所以遇到了瓶颈,看别人代码后,很不错。dfs中的嵌套在两条if语句中,所以程序肯定会存在终止的情况。题意:k种邮票,面值自定,共h张,求可组合成的最大值。要求从1开始连续。*/#include <cstdio>#include <cstring>int h,k;int ans[15],res;bool check(int target,int dep,int num,int tot,int *A,int end){if(target==tot)//看递归函数,要看主题,这里就是判断是否可以等于targetreturn 1;if(dep==end || num==h)return 0;if(check(target,dep+1,num,tot,A,end))//这里的使用存在技巧,仔细体会。和下面那个if语句可以保证所有的组合都可以进行一次判断return 1;if(check(target,dep,num+1,tot+A[dep],A,end))return 1;return 0;}void dfs(int cur,int *A,int dep){if(check(cur,0,0,0,A,dep))dfs(cur+1,A,dep);//架空,不存储curif(dep<k){A[dep]=cur;//存储curdfs(cur+1,A,dep+1);//A[dep]=-1;}if(cur-1>res){res=cur-1;memcpy(ans,A,sizeof(ans));}}int main(){//freopen("data.in","r",stdin);int A[15];while(scanf("%d %d",&h,&k)==2 && h && k){//memset(A,-1,sizeof(A));res=0;dfs(1,A,0);for(int i=0;i<k;i++)printf("%3d",ans[i]);printf(" ->%3d\n",res);}return 0;}

原创粉丝点击