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萬條指令 主儲存器容... 裝好iis後就先用預設的 看自己能不能訪問,然後再看下內網其他人能不能訪問,可以的話再進路由器配置,找到有個dmz主機,把你的ip地址192.168.1.103填進去,其實就像伺服器釋出一樣.看一下自己外網ip是多少,先試用ip訪問.dns的話還是建議用花生殼 現在的問題是internet上的人用i...如何自學計算機程式設計?如何學習計算機程式設計?
計算機如何分類,計算機軟體是如何分類的
個人計算機如何搭建web伺服器,如何用自己的電腦做一個WEB伺服器