如何用excel解決計算機揹包問題

2021-03-03 22:22:31 字數 4565 閱讀 4027

1樓:

可以bai用sumif函式來解決。 假設**

du表的標題是:序號zhi,日期,名dao

稱,數量 月報表的標回題是:序號,月份答,名稱,數量 那麼兩表都輸入資料以後,在月報表的數量這一列,我們假設是d4的公式寫上:=sumif(**表!

c:c,c4,**表!d:

d) 然後讓d列每個單元格都下拉複製公式,這樣,只要你在**表內輸入名稱和數量的時候,月報表相應的名稱行的數量就會自動統計。

計算機上的揹包問題是什麼,怎麼解決,能不能說一下思路,最好有c或者

2樓:匿名使用者

下面是引用的一段說明,有揹包問題的描述以及各種演算法的**,當然有些是vb的,有些是c++的,我覺得聽全面的,希望對你有所幫助。

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,...,**.若的每種物品的件數足夠多.

求旅行者能獲得的最大總價值。

本問題的數學模型如下:

設 f(x)表示重量不超過x公斤的最大價值,

則 f(x)=max 當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 改進的遞迴法

改進的的遞迴法的思想還是以空間換時間,這隻要將遞迴函式計算過程中的各個子函式的值儲存起來,開闢一個

一維陣列即可

程式如下:

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));

end.

3)貪婪演算法

改進的揹包問題:給定一個超遞增序列和一個揹包的容量,然後在超遞增序列中選(只能選一次)或不選每一個數值,使得選中的數值的和正好等於揹包的容量。

**思路:從最大的元素開始遍歷超遞增序列中的每個元素,若揹包還有大於或等於當前元素值的空間,則放入,然後繼續判斷下一個元素;若揹包剩餘空間小於當前元素值,則判斷下一個元素

簡單模擬如下:

#define k 10

#define n 10

#i nclude

#i nclude

void create(long array,int n,int k)

else/*揹包剩餘空間小於當前元素值*/

cankao[i]=0;

} }void main()

; int i;

long value,value1=0;

clrscr();

create(array,n,k);

output(array,n);

printf("\ninput the value of beibao:\n");

scanf("%ld",&value);

beibao(array,cankao,value,n);

for(i=0;i

#i nclude

void create(long array,int n,int k)

else

cankao[i]=0;

} }int beibao1(long array,int cankao,long value,int n)

else

cankao[i]=0;

if(value1==value)

return 1;

return 0;

} void main()

; int cankao1[n]=;

int i;

long value,value1=0;

clrscr();

create(array,n,k);

output(array,n);

printf("\ninput the value of beibao:\n");

scanf("%ld",&value);

beibao(array,cankao,value,n);

for(i=0;i=wi時: f(i,j)=max 1式

當0<=j

fn( 1 ,c) 是初始時揹包問題的最優解。

以本題為例:若0≤y<1 0,則f ( 3 ,y) = 0;若y≥1 0,f ( 3 ,y) = 1 5。利用2式,可得f (2, y) = 0 ( 0≤y<10 );f(2,y)= 1 5(1 0≤y<1 4);f(2,y)= 1 8(1 4≤y<2 4)和f(2,y)= 3 3(y≥2 4)。

因此最優解f ( 1 , 11 6 ) = m a x = m a x = m a x = 3 8。

現在計算xi 值,步驟如下:若f ( 1 ,c) =f ( 2 ,c),則x1 = 0,否則x1 = 1。接下來需從剩餘容量c-w1中尋求最優解,用f (2, c-w1) 表示最優解。

依此類推,可得到所有的xi (i= 1.n) 值。

在該例中,可得出f ( 2 , 116 ) = 3 3≠f ( 1 , 11 6 ),所以x1 = 1。接著利用返回值3 8 -p1=18 計算x2 及x3,此時r = 11 6 -w1 = 1 6,又由f ( 2 , 1 6 ) = 1 8,得f ( 3 , 1 6 ) = 1 4≠f ( 2 , 1 6 ),因此x2 = 1,此時r= 1 6 -w2 = 2,所以f (3,2) =0,即得x3 = 0。

excel如何自動從一堆資料中選取數個數字,使他們相加等於特定的一個值

3樓:ee飯

你就看下你需要哪些數字,然後選篩選唄,篩選出你需要的數字就可以了

4樓:罌粟老五

在excel表最上方有個「資料」的選單,裡邊有個「篩分」,你就可以按自己的要求篩分出來,注意選擇區域要正確啊。

如何自學計算機程式設計?如何學習計算機程式設計?

你好,首先你要有一臺電腦。然後網上找一個免費自學程式設計 每天在上面學習,敲敲打打 堅持且培養興趣!你會變成大佬的!望!如何學習計算機程式設計?可以找相關專業的學校進行學習的。對於計算機零基礎的同學來講,入門程式設計可以先從一些能夠獲得即時反饋的課程來學習,這裡推薦一個比較好的平臺,叫做 夜曲程式設...

計算機如何分類,計算機軟體是如何分類的

計算機分為模擬式電子計算機和數字式電子計算機兩大類。計算機又分巨型 大型 中型 小型 微型和單片型等。1 巨型機。主要是從效能方面去定義的。20世紀70年代,國際上以運算速度在每秒1000萬次以上,儲存容量在1000萬位以上的計算機稱為巨型機 也有人把運算速度超過每秒執行1000萬條指令 主儲存器容...

個人計算機如何搭建web伺服器,如何用自己的電腦做一個WEB伺服器

裝好iis後就先用預設的 看自己能不能訪問,然後再看下內網其他人能不能訪問,可以的話再進路由器配置,找到有個dmz主機,把你的ip地址192.168.1.103填進去,其實就像伺服器釋出一樣.看一下自己外網ip是多少,先試用ip訪問.dns的話還是建議用花生殼 現在的問題是internet上的人用i...