老婆叫我写一个算法,竟然想了一晚上没想出来,感觉还是有难度
她是搞会计的,叫我帮她写个算法,竟然想了一晚上没想出来
有个列表如下
品名 价格
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 改进的递归法
改进的的递归法的思想还是以空间换时间,这只要将递归函数计算过程中的各个子函数的值保存起来,开辟一个
一维数组即可