鱼C论坛

 找回密码
 立即注册
查看: 913|回复: 13

[已解决]请问这个穷举法作业怎么做

[复制链接]
发表于 2020-4-17 10:32:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一根长度为235m的材料,需要截成长度为19m和23m的短料,编程设计最佳截取方案,即求两种短料各截成多少根时,剩余的材料最少?(方案可能有多种,能列举一种即可。)
最佳答案
2020-4-17 11:28:27
  1. a=235//19
  2. c=235
  3. for i in range(1,a+1):
  4.     b=(235-i*19)//23
  5.     if c>(235-i*19-b*23):
  6.         c=235-i*19-b*23
  7.         d=(i,b,c)
  8. print(d)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-17 10:34:09 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 10:35:15 | 显示全部楼层

你这链的。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 10:39:42 | 显示全部楼层
  1. #include <stdio.h>
  2. int main()
  3. {

  4.         int a = 235;
  5.         int x,y;    //表示19m有x段 23米有y段
  6.         int z[100];
  7.         z[0]=235;   
  8.     int i=1;
  9.    
  10.         int x_min = 0;
  11.         int y_min = 0;
  12.         int z_min = 0;

  13. for(x=0;x<=7;x++)
  14.         {
  15.                 for(y=0;y<=5;y++)
  16.                 {

  17.                         z[i]=133-x*19-y*23;
  18.                         if( z[i]>=0 && z[i]<z[i-1])
  19.                         {
  20.                                 x_min = x;
  21.                                 y_min = y;
  22.                                 z_min = z[i];
  23.                         }
  24.                         i=i+1;
  25.                 }
  26.         }
  27.         printf("%d %d %d \n",x_min,y_min,z_min);
  28.         return 0;
  29. }
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
_2_ + 1 + 1 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-17 10:43:11 | 显示全部楼层

请问可以用python实现吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 10:57:24 From FishC Mobile | 显示全部楼层
Hello. 发表于 2020-4-17 10:39

你可能走错片场了……
但你还是很厉害……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 10:59:34 From FishC Mobile | 显示全部楼层
kllly 发表于 2020-4-17 10:43
请问可以用python实现吗

我觉得你这个题目就有问题
一边说「怎样剩余长度最短」,一边说「情况很多,列举一种即可」
最短的情况就只有一种啊……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 11:04:12 From FishC Mobile | 显示全部楼层
本帖最后由 _2_ 于 2020-4-17 11:27 编辑
  1. def func(line: int, x: int, y: int) -> int:
  2.     if x < y:
  3.         raise ValueError("'x' must bigger than 'y' or equivalent to 'y'.")
  4.     return line % (x + y)
  5.     return line % x if (x > y) and (line % x) < y else (line % x) + (line % x % y)
  6.     #这可能不是最妥当的情况
  7.     #其他的我再想想……
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-17 11:04:18 | 显示全部楼层
_2_ 发表于 2020-4-17 10:59
我觉得你这个题目就有问题
一边说「怎样剩余长度最短」,一边说「情况很多,列举一种即可」
最短的情况 ...

样例输出是5 6 2
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 11:04:53 From FishC Mobile | 显示全部楼层
kllly 发表于 2020-4-17 11:04
样例输出是5 6 2

?什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 11:14:35 From FishC Mobile | 显示全部楼层
kllly 发表于 2020-4-17 11:04
样例输出是5 6 2


你看看这个行不行
  1. line % x if (x > y) and (line % x < y) else (line % x) + (line % x % y)
复制代码

Screenshot_20200417_111330_com.forchange.pythonclass.jpg
已经是最简了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 11:21:57 | 显示全部楼层
  1. # coding=utf-8
  2. """
  3. Author:song
  4. """
  5. all=[]
  6. bb=300
  7. for i in range(0,13):
  8.     for j in range((235-(19*i))//23+1):
  9.         left=(235-(19*i)-(23*j))
  10.         if left<bb:
  11.             bb=left
  12.             print("19米的{}根,23米的{}根,剩余{}米".format(i,j,bb))
复制代码

得出来19米的5根,23米的6根,剩余2米
不知道对不对,有大佬的欢迎指教
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 11:28:27 | 显示全部楼层    本楼为最佳答案   
  1. a=235//19
  2. c=235
  3. for i in range(1,a+1):
  4.     b=(235-i*19)//23
  5.     if c>(235-i*19-b*23):
  6.         c=235-i*19-b*23
  7.         d=(i,b,c)
  8. print(d)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-17 12:14:02 | 显示全部楼层
  1. #coding=gbk
  2. def func(line:int,ln1:int,ln2:int):
  3.     y1 = line%ln1
  4.     y2 = line%ln2
  5.     f = lambda x,y: x if x>y else y
  6.     num = f(y1,y2)
  7.     ys = []
  8.     for i in range(num):
  9.         for j in range(i):
  10.             s = line - i*ln1 - j*ln2
  11.             if s >= 0:
  12.                 dict1 = {'剩余长度':s,'截取方法':'%d-%d*%d-%d*%d' % (line,i,ln1,j,ln2)}
  13.                 ls1 = [s,dict1]
  14.                 ys.append(ls1)
  15.     ys.sort()
  16.     return ys[0][1]
  17. f = func(235,19,23)
  18. print(f)
复制代码



结果:
{'剩余长度': 6, '截取方法': '235-6*19-5*23'}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-17 18:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表