蝎子豆丁
该算法是根据数学上的背包问题设计的。背包问题是一个最优化问题,即对一个给定空间或负重的背包和许多大小不一的物体,哪些物体放入背包才能使得浪费的背包空间或负重最小?在背包很小和物体数目较少时,这个问题还比较容易解决;但当背包很大且有很多个物体时,问题的求解就十分困难。通常,这个问题会有一个或者多个解,也有可能根本没有解。 1977年,Merkle与Hellman合作设计了使用背包问题实现信息加密的方法。其工作原理是:假定甲想加密,则先产生一个较易求解的背包问题,并用它的解作为专用密钥;然后从这个问题出发,生成另一个难解的背包问题,并作为公共密钥。如果乙想向甲发送报文,乙就可以使用难解的背包问题对报文进行加密,由于这个问题十分难解,所以一般没有人能够破译密文;甲收到密文后,可以使用易解的专用密钥解密。 该算法提出以后,经过多年的探讨和研究,最终发现了它的一个致命错误,使之失去了任何保密的实用价值。
贝贝花儿
1)登上算法用登山算法求解背包问题 function []=DengShan(n,G,P,W) %n是背包的个数,G是背包的总容量,P是价值向量,W是物体的重量向量 %n=3;G=20;P=[25,24,15];W2=[18,15,10];%输入量 W2=W; [Y,I]=sort(-P./W2);W1=[];X=[];X1=[]; for i=1:length(I) W1(i)=W2(I(i)); end W=W1; for i=1:n X(i)=0; RES=G;%背包的剩余容量 j=1; while W(j)<=RES X(j)=1; RES=RES-W(j); j=j+1; end X(j)=RES/W(j); end for i=1:length(I) X1(I(i))=X(i); end X=X1; disp('装包的方法是');disp(X);disp(X.*W2);disp('总的价值是:');disp(P*X');时间复杂度是非指数的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较大时,容易超时. 改进的递归法 改进的的递归法的思想还是以空间换时间,这只要将递归函数计算过程中的各个子函数的值保存起来,开辟一个 一维数组即可 程序如下: program knapsack04; const maxm=2000;maxn=30; type ar=array[0..maxn] of integer; var m,n,j,i,t:integer; c,w:ar; p:array[0..maxm] of integer; function f(x:integer):integer; var i,t,m:integer; begin if p[x]<>-1 then f:=p[x] else begin if x=0 then p[x]:=0 else begin t:=-1; for i:=1 to n do begin if x>=w[i] then m:=f(i-w[i])+c[i]; if m>t then t:=m; end; p[x]:=t; end; f:=p[x]; end; end; begin readln(m,n); for i:= 1 to n do readln(w[i],c[i]); fillchar(p,sizeof(p),-1); writeln(f(m)); )贪婪算法改进的背包问题:给定一个超递增序列和一个背包的容量,然后在超递增序列中选(只能选一次)或不选每一个数值,使得选中的数值的和正好等于背包的容量。代码思路:从最大的元素开始遍历超递增序列中的每个元素,若背包还有大于或等于当前元素值的空间,则放入,然后继续判断下一个元素;若背包剩余空间小于当前元素值,则判断下一个元素简单模拟如下:#define K 10#define N 10#i nclude <>#i nclude <>void create(long array[],int n,int k){/*产生超递增序列*/ int i,j; array[0]=1; for(i=1;i
一、选题的意义与价值 也就是写作的意图、缘由。意义与价值如果能区分开,就分开论述;如果不能,就合在一起说明。一般而言,主要从2个大的方面去写。一是理论意义与价值
太阳能背包的原理是将太阳能的能量转换为电能存储在太阳能背包的内置电池里,在需要对手机,MP3,数码相机充电时,太阳能背包里的蓄电池将电能输出对其充电。太阳能背包
去看(计算机科学与应用)这样的论文~~~
国内期刊论文查重非常严格。本科学士学位论文可在30%以下申请答辩,15%以下可申请学院优秀论文。硕士论文查重率低于20%,可直接申请答辩。如果低于40%,可在两
题目:应简洁、明确、有概括性。关键词:从论文标题或正文中挑选3~5个最能表达主要内容的词作为关键词。摘要:(150字)要有高度的概括力,语言精练、明确,交代本文