比如说一根10m米的钢材,要切割成4.5米,2.8米,1.2米三种,问共有多少种切割方法。

难道又要叫暗里着迷 2015-03-29 06:15:23
求教!!!比如说一根10m米的钢材,要切割成4.5米,2.8米,1.2米三种,问共有多少种切割方法。比如4.5和4.5是一种,4.5和2.8和1.2是一种,2.8和2.8和2.8和1.2是一种。 不一定每种都要有,可以有剩余,但剩余一定要小于最小的长度,这里是1.2。 怎么写啊。。。。
...全文
308 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-04-01
  • 打赏
  • 举报
回复
引用 14 楼 yunchao630 的回复:
[quote=引用 9 楼 zhao4zhong1 的回复:] 更接近实际一些,比如增加一个条件,每条割缝最多占0.01米宽,fly_dragon_fly给个代码供大家伙收藏一下。
收藏这代码有什么用?下次有人问,你再粘贴上?[/quote] 不幸言中了!
翅膀又硬了 2015-03-31
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
更接近实际一些,比如增加一个条件,每条割缝最多占0.01米宽,fly_dragon_fly给个代码供大家伙收藏一下。
收藏这代码有什么用?下次有人问,你再粘贴上?
niwudayelaile 2015-03-31
  • 打赏
  • 举报
回复
楼上给的答案为什么总显示运行错误?求解
AndyStevens 2015-03-30
  • 打赏
  • 举报
回复
引用 6 楼 Automation_dmu 的回复:
背包问题,动态规划解决,递归式如下:
F=剩余长度, L=10.0 Lx=当次截取的长度, X=第几次截取 F(L,X) = min { L - F(L-Lx, X)- Lx }
AndyStevens 2015-03-30
  • 打赏
  • 举报
回复
背包问题,动态规划解决,递归式如下:
fly_dragon_fly 2015-03-30
  • 打赏
  • 举报
回复
引用 4 楼 dooX8086 的回复:
[quote=引用 2 楼 fly_dragon_fly 的回复:] 直接dfs吧,调用dfs(100,100)就是答案
int dfs(int n,int mx) {
    if(n<12) return 1;
    int ct=0;
    if(mx>=45) ct +=dfs(n-45,45);
    if(mx>=28) ct +=dfs(n-28,28);
    if(mx>=12) ct +=dfs(n-12,12);
    return ct;
}
代码看起来简洁,但其逻辑却没有两个 for 好理解.(起码对于我来讲来是这样) 还有我对这代码有点怀疑.跑了一下得出结果是 9 种 但正确的结果应该是 7 种 吧 ----------------------------------------------------------------- count: 7 | 余 ---------------------------------------------------------------- 45 * 0, 28 * 0, 12 * 8 | 4 45 * 0, 28 * 1, 12 * 6 | 0 45 * 0, 28 * 2, 12 * 3 | 8 45 * 0, 28 * 3, 12 * 1 | 4 45 * 1, 28 * 0, 12 * 4 | 7 45 * 1, 28 * 1, 12 * 2 | 3 45 * 2, 28 * 0, 12 * 0 | 10[/quote] 程序没验证过,看起来小于0漏了,多谢指正
int dfs(int n,int mx) {
    if(n<0) return 0;
    if(n<12) return 1;
    int ct=0;
    if(mx>=45) ct +=dfs(n-45,45);
    if(mx>=28) ct +=dfs(n-28,28);
    if(mx>=12) ct +=dfs(n-12,12);
    return ct;
}
dooX8086 2015-03-30
  • 打赏
  • 举报
回复
引用 2 楼 fly_dragon_fly 的回复:
直接dfs吧,调用dfs(100,100)就是答案
int dfs(int n,int mx) {
    if(n<12) return 1;
    int ct=0;
    if(mx>=45) ct +=dfs(n-45,45);
    if(mx>=28) ct +=dfs(n-28,28);
    if(mx>=12) ct +=dfs(n-12,12);
    return ct;
}
代码看起来简洁,但其逻辑却没有两个 for 好理解.(起码对于我来讲来是这样) 还有我对这代码有点怀疑.跑了一下得出结果是 9 种 但正确的结果应该是 7 种 吧 ----------------------------------------------------------------- count: 7 | 余 ---------------------------------------------------------------- 45 * 0, 28 * 0, 12 * 8 | 4 45 * 0, 28 * 1, 12 * 6 | 0 45 * 0, 28 * 2, 12 * 3 | 8 45 * 0, 28 * 3, 12 * 1 | 4 45 * 1, 28 * 0, 12 * 4 | 7 45 * 1, 28 * 1, 12 * 2 | 3 45 * 2, 28 * 0, 12 * 0 | 10
赵4老师 2015-03-30
  • 打赏
  • 举报
回复
引用 2 楼 fly_dragon_fly 的回复:
直接dfs吧,调用dfs(100,100)就是答案
int dfs(int n,int mx) {
    if(n<12) return 1;
    int ct=0;
    if(mx>=45) ct +=dfs(n-45,45);
    if(mx>=28) ct +=dfs(n-28,28);
    if(mx>=12) ct +=dfs(n-12,12);
    return ct;
}
有够简洁! “给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
fly_dragon_fly 2015-03-30
  • 打赏
  • 举报
回复
直接dfs吧,调用dfs(100,100)就是答案
int dfs(int n,int mx) {
    if(n<12) return 1;
    int ct=0;
    if(mx>=45) ct +=dfs(n-45,45);
    if(mx>=28) ct +=dfs(n-28,28);
    if(mx>=12) ct +=dfs(n-12,12);
    return ct;
}
hanyue03 2015-03-30
  • 打赏
  • 举报
回复
高手真多啊 !!
Never_Satisfied 2015-03-30
  • 打赏
  • 举报
回复
我只能想到枚举
赵4老师 2015-03-30
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
更接近实际一些,比如增加一个条件,每条割缝最多占0.01米宽,fly_dragon_fly给个代码供大家伙收藏一下。
为接近实际,还需要改割成4.55米,2.88米,1.22米;每条割缝最多占0.01米
赵4老师 2015-03-30
  • 打赏
  • 举报
回复
更接近实际一些,比如增加一个条件,每条割缝最多占0.01米宽,fly_dragon_fly给个代码供大家伙收藏一下。
赵4老师 2015-03-30
  • 打赏
  • 举报
回复
用浮点数小心浮点数二进制表示的误差。
WWShaw 2015-03-29
  • 打赏
  • 举报
回复
int nCount=0; int iter45,iter28; double left; for(iter45=0;iter45*4.5<=10.0;++iter45){ left=10.0-iter45*4.5; for(iter28=0;iter28*2.8<=left;++iter28){ nCount++; } }

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧