算法问题

yanli 2009-06-03 02:43:07
比如说药品,进货时有药品的批次及数量,要求任意数量的的最少批次。

批次 数量
1 200
2 300
3 50
4 150

现在要500数量的药品,哪么根据最少批次的原则应该选择1,2批次,而不能选择2,3,4批次。
用循环套循环的笨办法,感觉运算量很大,各位老大有什么好的方法吗?多谢了。
...全文
104 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
azhe0660 2009-06-03
  • 打赏
  • 举报
回复
顶11楼和14楼.动态规划是正解
光宇广贞 2009-06-03
  • 打赏
  • 举报
回复
典型的动态规划,背包算法……
请楼主查阅。
xiangbupingfan 2009-06-03
  • 打赏
  • 举报
回复
操作系统分配算法
cheeks 2009-06-03
  • 打赏
  • 举报
回复
贪心比较好吧最快
windstore 2009-06-03
  • 打赏
  • 举报
回复
贪心算法不能获得最优解。。
获得最优解的话,需要用动态规划。。
楼主可以搜下很经典的"背包问题"在贪心算法和动态规划中的实现
guohouchang1 2009-06-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hecker728 的回复:]
现在需要的药品 x

先将批次的数量排序

批次 数量 arrayCount
2 300  a
1 200 b
4 150 c
3 50 d
result=0;
for(int i=0;i <arrayCount.length;i++)
{
if((x-result)>=arrayCount[i])
{
result+=arrayCount[i];
//输出i对应的批次
     return;
}
}
递归调用,直到result=x;
[/Quote]


递归算法效率低
qgylovelj 2009-06-03
  • 打赏
  • 举报
回复
楼主把问题再描述一下,你想要的结果是必须正好加起来 500还是可以大于500?如果是可以大于500就很简单,如果是必须等于500还是的用循环,等楼主发言ING。。。。。
hecker728 2009-06-03
  • 打赏
  • 举报
回复
现在需要的药品 x

先将批次的数量排序

批次 数量 arrayCount
2 300  a
1 200 b
4 150 c
3 50 d
result=0;
for(int i=0;i<arrayCount.length;i++)
{
if((x-result)>=arrayCount[i])
{
result+=arrayCount[i];
//输出i对应的批次
     return;
}
}
递归调用,直到result=x;





烈火蜓蜻 2009-06-03
  • 打赏
  • 举报
回复
接分来了
linlusheng 2009-06-03
  • 打赏
  • 举报
回复
先找最大的,未必是最优的,但是按照楼主的贪心准则,你要的是最少次数,所以只能按照一楼那样,先遍历所有数字,找出最大,再依次循环,当然,即使这样,有时候得到的结果也不是最优的
Mr-Jee 2009-06-03
  • 打赏
  • 举报
回复
贪心吧。。
12345_ 2009-06-03
  • 打赏
  • 举报
回复
不太明白,500这个数必须刚好是两个批次加起来的和么?
12345_ 2009-06-03
  • 打赏
  • 举报
回复
貌似是先进先出法
ToHai 2009-06-03
  • 打赏
  • 举报
回复
jf
bbwolfcool 2009-06-03
  • 打赏
  • 举报
回复
如果你这个必须正好加起来 500,就必须嵌套迭代了吧,
如果多一些没关系,那就比较简单了

找到最大的数字,然后把其余的从小到大排序,一个个加,刚好加起来大于等于 500,就要那个数

比如 先找到 300,然后一个个试和

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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