uva 165 卡住了一下午!
2013-11-01 21:09
239 查看
最近上网发现自己写的文章出现在很多人的博客上面,还不注明是转载,还是原创!面对这种行为我无力吐槽,转载还请注明出处。谢谢!
http://blog.csdn.net/monkeyduck
这道题题意不太好懂,说的是给定h和k两个数,h是邮票的张数,k是邮票面额的种类,h+k<=9。举例来说,h=3,k=2就是有最多可以选三张邮票,有两种面额的邮票可选,具体面值多少自己定,要求可以组成的面额必须是连续且最大。面额可以定为1块和3块,这样选3张可以组成1,2,3,4,5,6,7,9块的总面额,所以最大连续的值为7。同样可以定面额为1块和四块,这样可以组成1,2,3,4,5,6,8,9,12块,但连续的只能到6,所以h=3,k=2这种条件下7是最有解。
这个题最开始我是用的回溯套回溯的办法,因为面额要枚举,然后每一张怎么选也要枚举,但这样非常慢,后来参考网上别人的做法,先枚举在现有邮票的情况下可以达到的最大连续面额,然后枚举面额,每往后枚举一位的下限是前一位的面额+1,上限是之前的连续和的最大值+1。
http://blog.csdn.net/monkeyduck
这道题题意不太好懂,说的是给定h和k两个数,h是邮票的张数,k是邮票面额的种类,h+k<=9。举例来说,h=3,k=2就是有最多可以选三张邮票,有两种面额的邮票可选,具体面值多少自己定,要求可以组成的面额必须是连续且最大。面额可以定为1块和3块,这样选3张可以组成1,2,3,4,5,6,7,9块的总面额,所以最大连续的值为7。同样可以定面额为1块和四块,这样可以组成1,2,3,4,5,6,8,9,12块,但连续的只能到6,所以h=3,k=2这种条件下7是最有解。
这个题最开始我是用的回溯套回溯的办法,因为面额要枚举,然后每一张怎么选也要枚举,但这样非常慢,后来参考网上别人的做法,先枚举在现有邮票的情况下可以达到的最大连续面额,然后枚举面额,每往后枚举一位的下限是前一位的面额+1,上限是之前的连续和的最大值+1。
#include<iostream> #include<cstring> #include<iomanip> using namespace std; int h,k,Maxsum,Put[10],De[10],finalDe[10]; bool vis[200]; void getsum(int n,int cur,int sum) //在现有邮票情况下的面额 { if (cur==h) { vis[sum]=1; return; } vis[sum]=1; for (int i=0;i<=n;i++) getsum(n,cur+1,sum+De[i]); } void dfs(int cur,int num) { if (cur==k+1) { if (num-1>Maxsum) { Maxsum=num-1; memcpy(finalDe,De,sizeof(De)); } } else { for (int i=De[cur-1]+1;i<=num;i++) { De[cur]=i; memset(vis,0,sizeof(vis)); getsum(cur,0,0); //为了标记vis数组得到下一次枚举面额的上限j int j=De[cur-1]+1; while(vis[j++]) ; dfs(cur+1,j-1); //j-1即为之前的面额无法达到的值,下一次枚举的面额不能超过此致,否则会出现断点 } } } int main() { while (cin>>h>>k&&h) { Maxsum=0; De[0]=0; De[1]=1; dfs(2,h+1); for (int i=1;i<=k;i++) cout<<setw(3)<<finalDe[i]; cout<<" ->"; cout<<setw(3)<<Maxsum<<endl; } return 0; }
相关文章推荐
- 关于指针的一些事情
- C/C++数据对齐详细解析
- C++中引用的使用总结
- C++中引用(&)的用法与应用实例分析
- 解析C++ 浮点数的格式化输出
- 深入分析C++中几个最不常用的关键字
- c++中inline的用法分析
- 深入解析C++ Data Member内存布局
- 从汇编看c++中默认构造函数的使用分析
- 关于C++中的友元函数的一些总结
- C++的sstream标准库详细介绍
- 基于C++自动化编译工具的使用详解
- 浅谈C++中的string 类型占几个字节
- C/C++ 宏详细解析
- 深入分析C++中两个大数相乘结果不正确的问题
- 探讨C++中数组名与指针的用法比较分析
- 深入解析C++中的引用类型
- C++可变参数的实现方法
- C++中的常对象与常对象成员详解
- 基于C++类型重定义的使用详解