求凑金额算法,各位高手帮帮忙呀!!!!

metro 2010-07-15 09:34:10
表A 中有以下记录
序号 发票号 总金额
1 AX001 16000
2 AX002 3200
3 AX003 50000
....
10 AX010 12000

表B中有以下记录
序号 原材料名称 单价 数量
1 a 100 50
2 b 50 10
3 c 5.4 200
.....
300 z 34 56
现在要得到表A中每一笔发票对应表B的原材料清单,有以下要求:
1.表A中各发票总金额不能变动。
2.表A各发票关联的原材料清单集合包含了所有表B的原材料明细,并且只能包含表B中的原材料明细。
3.表B中的每个原材料数量要与表A各发票中有该原材料的数量之和相等(比如当a 原材料已经被发票AX001 关联了数量29,
在 AX002中有a原材料5 ,在 AX00X有a原材料16 也就是a原材料共有50个 ,在A表中三张发票中的数量之和也必须为50)

各位大虾们帮帮忙呀,现在一点思路都没有
...全文
616 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fenix124 2010-07-23
  • 打赏
  • 举报
回复
假定有m个产品,n张发票,可以列包含m*n个变量的m+n个等式.求得该方程组的任意一个整数解就可以了
metro 2010-07-20
  • 打赏
  • 举报
回复
upup
APOLLO_TS 2010-07-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 superdullwolf 的回复:]

最近我在使用matlab数学工具。

这个题目感觉有问题,应该多数情况下无解,和背包算法还不一样,因为缺少最优条件。

第一,按照解方程组来解,显然变量的矩阵大于方程的数量,要么无穷多解,要么无解。

他的解应该是个A行B列的矩阵。拿4*4来举例,
P=[100,50,5.4,34]';%单价P已知,P是个列向量
C=[16000,3200,50000,12000]';%发票总金……
[/Quote]

这个问题有点像 一笔连九点的智能划线。

也就是说 划线次数固定【是发票数】,但是划线路径未知。

划线结束后,所有节点全部链接。这个是一个必要条件

如果允许连笔,其实,也就是每一个部分路径都是一个发票。也就变成了一笔连多点的带权划线。

我也就是说说。对算法没什么研究。CSDN总算有点牛奔问题了,支持!


超级大笨狼 2010-07-18
  • 打赏
  • 举报
回复
最近我在使用matlab数学工具。

这个题目感觉有问题,应该多数情况下无解,和背包算法还不一样,因为缺少最优条件。

第一,按照解方程组来解,显然变量的矩阵大于方程的数量,要么无穷多解,要么无解。

他的解应该是个A行B列的矩阵。拿4*4来举例,
P=[100,50,5.4,34]';%单价P已知,P是个列向量
C=[16000,3200,50000,12000]';%发票总金额C已知,C是列向量
B=[50,10,200,56];%总数B已知,B是行向量

那么X应该满足有X*P=C (这里*是矩阵的叉乘)得到方程一。
同时还应该满足I*X=B(这里I是4*4的1矩阵,可以用ones(size(B),size(B))来生成)
编码如下:

syms X P C I B;
P=[100,50,5.4,34]';%单价P已知
C=[16000,3200,50000,12000]';%发票总金额C已知,行乘价格相加=C,X*P=C
B=[50,10,200,56];%总数B已知,列相加
I=ones(size(B))
S=solve('X*P=C','I*X=B')
eval(S.X)

可以看到只有复数解,在实数范围内无解。

第二,按照整数规划来解,显然缺少一个最优函数。
我假设f=[P P P P]'或者全是16个1的情况,或者随机数字的情况,按照线性规划来做都是无解的。
(注:整数规划的第一步先做线性规划,然后根据解的情况,分别组合上下取整)
z=zeros(1,4)
o=ones(1,4)
y=eye(4)
P=[100,50,5.4,34]
C=[16000,3200,50000,12000]
B=[50,10,200,56]
aeq=[o z z z;z o z z;z z o z;z z z o;y y y y]
beq=[C B]'
lb=zeros(16,1);
ub=[B B B B]
f=[P P P P]'
linprog(f,[],[],aeq,beq,lb,ub);

得到错误:
Exiting: One or more of the residuals, duality gap, or total relative error
has grown 100000 times greater than its minimum value so far:
the primal appears to be infeasible (and the dual unbounded).
(The dual residual < TolFun=1.00e-008.)



所以楼主的题目,我认为是有问题。

要么缺少准确数据,因为解那个方程,如果随机输入数据,基本上是没解的。
除非恰好给出了某些满足要求的数字。

要么缺少个最优化的条件。





metro 2010-07-18
  • 打赏
  • 举报
回复
up up
metro 2010-07-18
  • 打赏
  • 举报
回复
每笔发票的总金额与筹出原材料的明细的价钱之和其实可以有一个差值(比如10之内),因为无法保证确实能筹出满足条件的组合,谢谢各位大侠回复,还有其它的方法吗?
  • 打赏
  • 举报
回复
这个背包算法,网上有下载,自已找找.
metro 2010-07-17
  • 打赏
  • 举报
回复
up,再 up
metro 2010-07-16
  • 打赏
  • 举报
回复
csdn的牛人呢
d_south 2010-07-16
  • 打赏
  • 举报
回复
我觉得是一个典型的背包问题。可以学习《背包九讲》。
acdbxzyw 2010-07-15
  • 打赏
  • 举报
回复
挺难,像解多元方程。。。
metro 2010-07-15
  • 打赏
  • 举报
回复
自己顶一个,这个主要是要求出各发票对应的材料清单

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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