日期:2014-05-20  浏览次数:20664 次

老婆叫我写一个算法,竟然想了一晚上没想出来,感觉还是有难度
她是搞会计的,叫我帮她写个算法,竟然想了一晚上没想出来
 
有个列表如下    

品名     价格
a           1.2    
b           3.4    
c           6.2    
.....    
 
列表数量不确定.会有更多(用合计总价凑出单个数量来)    
 
现在要求     求出     a1,a2,a3         表示数量
价格   *   数量(未知)   =   已知

1.2     *     a1     +     3.4     *     a2     +     6.2     *     a3     =     14.2     (合计总价,动态得到)    
 
(a1,a2,a3     ...=An为整数,可以设置An最大数)    
 
本列得到An为2时:a1=1;a2=2;a3=1    
 
当然会有多个答案,都输出来。    
 
注意列表数,和An数据比较大的时候的速度    



------解决方案--------------------
(a1,a2,a3 ...=An为整数,可以设置An最大数)
这是说a1+a2+a3..=An?还是什么意思
============================================================
就是说a1,a2,a3 <= An
理解能力也需要锻炼阿
------解决方案--------------------
感觉这是一个矩阵的问题,用那里面的数学知识解决可能比较好.不过毕业后就都忘了:(
描述:
price=(p1,p2,p3,……pn)

quantity=(q11,q12,q13……q1m
q21,q22,q23……q2m
q31,q32,q33……q3m
……
qn1,qn2,qn3……qnm)

result=(r1,r2,r3,……rn)

r1=r2=r3=……=rn
price*quantity=result
求 quantity

不知道这样描述对不对?
------解决方案--------------------
看不明白...

纯顶吧!
------解决方案--------------------
看着 这个
价格 * 数量(未知) = 已知
1.2 * a1 + 3.4 * a2 + 6.2 * a3 = 14.2 (合计总价,动态得到)
的条件,怎么越看越像,在PB讨论块里面的 一个算法问题啊!?

http://community.csdn.net/Expert/TopicView3.asp?id=5370530
PB贴的大概意思是: 求数值在 1 - n 之内的任意x个数之和为y。

变通一下,把价格和总价 * 100 变为整数 ,所以就比较特殊的 情况了,可以确定价格*数量的一个总区间, 可以参考一下,


呵呵! 我也写了一个, 在现在的47楼,现在的倒数 2楼,呵呵。。。。。


------解决方案--------------------
背包, NPC ....
------解决方案--------------------
大致的思路:
定义类
class Goods {
品名
价格
数量; // 根据总价计算出最大数量值,并联Min(最大数量值, An), 或标记为Qn
}
把Goods放到队列遍历,记品种的数量为m种
比较次数
Q1*Q2*....Qm

如果在品种不多或者总价数值不大的情况下,运算速度还是可以保障的.
------解决方案--------------------
2)递归法
先看完全背包问题
一个旅行者有一个最多能用m公斤的背包,现在有n种物品,每件的重量分别是W1,W2,...,Wn,
每件的价值分别为C1,C2,...,Cn.若的每种物品的件数足够多.
求旅行者能获得的最大总价值。
本问题的数学模型如下:
设 f(x)表示重量不超过x公斤的最大价值,
则 f(x)=max{f(x-i)+c[i]} 当x> =w[i] 1 <=i <=n
可使用递归法解决问题程序如下:
program knapsack04;
const maxm=200;maxn=30;
type ar=array[0..maxn] of integer;
var m,n,j,i,t:integer;
c,w:ar;
function f(x:integer):integer;
var i,t,m:integer;
begin
if x=0 then f:=0 else
begin
t:=-1;
for i:=1 to n do
begin
if x> =w[i] then m:=f(x-i)+c[i];
if m> t then t:=m;
end;
f:=t;
end;
end;
begin
readln(m,n);
for i:= 1 to n do
readln(w[i],c[i]);
writeln(f(m));
end.
说明:当m不大时,编程很简单,但当m较大时,容易超时.
4.2 改进的递归法
改进的的递归法的思想还是以空间换时间,这只要将递归函数计算过程中的各个子函数的值保存起来,开辟一个
一维数组即可