1背包問題動態規划算法java的簡單介紹

本文目錄一覽:

背包問題的算法

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 mt 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 mt 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 stdlib.h

#i nclude conio.h

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

{/*產生超遞增序列*/

int i,j;

array[0]=1;

for(i=1;in;i++)

{

long t=0;

for(j=0;ji;j++)

t=t+array[j];

array[i]=t+random(k)+1;

}

}

void output(long array[],int n)

{/*輸出當前的超遞增序列*/

int i;

for(i=0;in;i++)

{

if(i%5==0)

printf(“\n”);

printf(“%14ld”,array[i]);

}

}

void beibao(long array[],int cankao[],long value,int count)

{/*背包問題求解*/

int i;

long r=value;

for(i=count-1;i=0;i–)/*遍歷超遞增序列中的每個元素*/

{

if(r=array[i])/*如果當前元素還可以放入背包,即背包剩餘空間還大於當前元素*/

{

r=r-array[i];

cankao[i]=1;

}

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

cankao[i]=0;

}

}

void main()

{

long array[N];

int cankao[N]={0};

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;iN;i++)/*所有已經選中的元素之和*/

if(cankao[i]==1)

value1+=array[i];

if(value==value1)

{

printf(“\nWe have got a solution,that is:\n”);

for(i=0;iN;i++)

if(cankao[i]==1)

{

if(i%5==0)

printf(“\n”);

printf(“%13ld”,array[i]);

}

}

else

printf(“\nSorry.We have not got a solution.\n”);

}

貪婪算法的另一種寫法,beibao函數是以前的代碼,用來比較兩種算法:

#define K 10

#define N 10

#i nclude stdlib.h

#i nclude conio.h

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

{

int i,j;

array[0]=1;

for(i=1;in;i++)

{

long t=0;

for(j=0;ji;j++)

t=t+array[j];

array[i]=t+random(k)+1;

}

}

void output(long array[],int n)

{

int i;

for(i=0;in;i++)

{

if(i%5==0)

printf(“\n”);

printf(“%14ld”,array[i]);

}

}

void beibao(long array[],int cankao[],long value,int count)

{

int i;

long r=value;

for(i=count-1;i=0;i–)

{

if(r=array[i])

{

r=r-array[i];

cankao[i]=1;

}

else

cankao[i]=0;

}

}

int beibao1(long array[],int cankao[],long value,int n)

{/*貪婪算法*/

int i;

long value1=0;

for(i=n-1;i=0;i–)/*先放大的物體,再考慮小的物體*/

if((value1+array[i])=value)/*如果當前物體可以放入*/

{

cankao[i]=1;/*1表示放入*/

value1+=array[i];/*背包剩餘容量減少*/

}

else

cankao[i]=0;

if(value1==value)

return 1;

return 0;

}

void main()

{

long array[N];

int cankao[N]={0};

int cankao1[N]={0};

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;iN;i++)

if(cankao[i]==1)

value1+=array[i];

if(value==value1)

{

printf(“\nWe have got a solution,that is:\n”);

for(i=0;iN;i++)

if(cankao[i]==1)

{

if(i%5==0)

printf(“\n”);

printf(“%13ld”,array[i]);

}

}

else

printf(“\nSorry.We have not got a solution.\n”);

printf(“\nSecond method:\n”);

if(beibao1(array,cankao1,value,N)==1)

{

for(i=0;iN;i++)

if(cankao1[i]==1)

{

if(i%5==0)

printf(“\n”);

printf(“%13ld”,array[i]);

}

}

else

printf(“\nSorry.We have not got a solution.\n”);

}

4)動態規划算法

解決0/1背包問題的方法有多種,最常用的有貪婪法和動態規劃法。其中貪婪法無法得到問題的最優解,而動態規劃法都可以得到最優解,下面是用動態規劃法來解決0/1背包問題。

動態規划算法與分治法類似,其基本思想是將待求解問題分解成若干個子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃法求解的問題,經分解得到的子問題往往不是互相獨立的,若用分治法解這類問題,則分解得到的子問題數目太多,以至於最後解決原問題需要耗費過多的時間。動態規劃法又和貪婪算法有些一樣,在動態規劃中,可將一個問題的解決方案視為一系列決策的結果。不同的是,在貪婪算法中,每採用一次貪婪準則便做出一個不可撤回的決策,而在動態規劃中,還要考察每個最優決策序列中是否包含一個最優子序列。

0/1背包問題

在0 / 1背包問題中,需對容量為c 的背包進行裝載。從n 個物品中選取裝入背包的物品,每件物品i 的重量為wi ,價值為pi 。對於可行的背包裝載,背包中物品的總重量不能超過背包的容量,最佳裝載是指所裝入的物品價值最高,即p1*x1+p2*x1+…+pi*xi(其1=i=n,x取0或1,取1表示選取物品i) 取得最大值。

在該問題中需要決定x1 .. xn的值。假設按i = 1,2,…,n 的次序來確定xi 的值。如果置x1 = 0,則問題轉變為相對於其餘物品(即物品2,3,.,n),背包容量仍為c 的背包問題。若置x1 = 1,問題就變為關於最大背包容量為c-w1 的問題。現設r?{c,c-w1 } 為剩餘的背包容量。

在第一次決策之後,剩下的問題便是考慮背包容量為r 時的決策。不管x1 是0或是1,[x2 ,.,xn ] 必須是第一次決策之後的一個最優方案,如果不是,則會有一個更好的方案[y2,.,yn ],因而[x1,y2,.,yn ]是一個更好的方案。

假設n=3, w=[100,14,10], p=[20,18,15], c= 116。若設x1 = 1,則在本次決策之後,可用的背包容量為r= 116-100=16 。[x2,x3 ]=[0,1] 符合容量限制的條件,所得值為1 5,但因為[x2,x3 ]= [1,0] 同樣符合容量條件且所得值為1 8,因此[x2,x3 ] = [ 0,1] 並非最優策略。即x= [ 1,0,1] 可改進為x= [ 1,1,0 ]。若設x1 = 0,則對於剩下的兩種物品而言,容量限制條件為116。總之,如果子問題的結果[x2,x3 ]不是剩餘情況下的一個最優解,則[x1,x2,x3 ]也不會是總體的最優解。在此問題中,最優決策序列由最優決策子序列組成。假設f (i,y) 表示剩餘容量為y,剩餘物品為i,i + 1,…,n 時的最優解的值,即:利用最優序列由最優子序列構成的結論,可得到f 的遞歸式為:

當j=wi時: f(i,j)=max{f(i+1,j),f(i+1,j-wi)+vi} ①式

當0=jwi時:f(i,j)=f(i+1,j) ②式

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

以本題為例:若0≤y<1 0,則f ( 3 ,y) = 0;若y≥1 0,f ( 3 ,y) = 1 5。利用②式,可得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 {f(2,11 6),f(2,11 6 – w1)+ p1} = m a x {f(2,11 6),f(2,1 6)+ 2 0 } = m a x { 3 3,3 8 } = 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。

c語言01背包問題誰能簡單說下

01背包問題就是有個容量為W的包,然後有一堆的物品(1…n),其中wi、vi分別為第i個物品的重量和價值,現在需要求的就是使得包中所裝的物品儘可能的價值高。那麼這個物品放不放在包中對應取值0

or

1。其算法為動態規劃,需要證明最優子結構性質。用s[i][j]表示只有前i個物品且包容量為j時所能等到的最大價值,而有遞歸式

s[i][j]=

s[i-1][j],

wij

max{s[i-1][j],s[i-1][j-wi]+vi},

wi=j

s[0][j]=0

1=j=W

s[i][0]=0

1=i=n

所以不論用什麼語言實現,就是計算上面的式子,最終求得s[n][W],上面的式子很好用遞推實現的,這個是自底向上的,就是兩層for;你也可以用棧實現自頂向下的,這個是記錄式的方法。

以上的W是只考慮整數的。

0-1背包問題java代碼

import java.io.BufferedInputStream;

import java.util.Scanner;

public class test {

    public static int[] weight = new int[101];

    public static int[] value = new int[101];

    public static void main(String[] args) {

        Scanner cin = new Scanner(new BufferedInputStream(System.in));

        int n = cin.nextInt();

        int W = cin.nextInt();

        for (int i = 0; i  n; ++i) {

            weight[i] = cin.nextInt();

            value[i] = cin.nextInt();

        }

        cin.close();

        System.out.println(solve(0, W, n)); // 普通遞歸

        System.out.println(“=========”);

        System.out.println(solve2(weight, value, W)); // 動態規劃表

    }

    public static int solve(int i, int W, int n) {

        int res;

        if (i == n) {

            res = 0;

        } else if (W  weight[i]) {

            res = solve(i + 1, W, n);

        } else {

            res = Math.max(solve(i + 1, W, n), solve(i + 1, W – weight[i], n) + value[i]);

        }

        return res;

    }

    public static int solve2(int[] weight, int[] value, int W) {

        int[][] dp = new int[weight.length + 1][W + 1];

        for (int i = weight.length – 1; i = 0; –i) {

            for (int j = W; j = 0; –j) {

                dp[i][j] = dp[i + 1][j]; // 從右下往左上,i+1就是剛剛記憶過的背包裝到i+1重量時的最大價值

                if (j + weight[i] = W) { // dp[i][j]就是背包已經裝了j的重量時,能夠獲得的最大價值

                    dp[i][j] = Math.max(dp[i][j], value[i] + dp[i + 1][j + weight[i]]);

// 當背包重量為j時,要麼沿用剛剛裝的,本次不裝,最大價值dp[i][j],要麼就把這個重物裝了,那麼此時背包裝的重量為j+weight[i],

// 用本次的價值value[i]加上背包已經裝了j+weight[i]時還能獲得的最大價值,因為是從底下往上,剛剛上一步算過,可以直接用dp[i+1][j+weight[i]]。

// 然後選取本次不裝weight[i]重物時獲得的最大價值以及本次裝weight[i]重物獲得的最大價值兩者之間的最大值

                }

            }

        }

        return dp[0][0];

    }

}

關於這個java語言描述的0-1背包問題是否有錯誤?

有點問題:

public static void knapsack(int[]v,int[]w,int c,int[][]m)

{

int n=v.length-1;

int jMax=Math.min(w[n]-1,c);

for(int j=0;j=jMax;j++)

m[n][j]=0;

for(int j=w[n];j=c;j++)

m[n][j]=v[n];

for(int i=n-1;i1;i–)

{

jMax=Math.min(w[i]-1,c);

for(int j=0;j=jMax;j++)

m[i][j]=m[i+1][j];

for(int j=w[i];j=c;j++)

m[i][j]=Math.max(m[i+1][j],m[i+1][j-w[i]]+v[i]);

}

m[1][c]=m[2][c];

if(c=w[1])

m[1][c]=Math.max(m[1][c],m[2][c-w[1]]+v[1]);

}

public static void traceback(int[][]m,int[]w,int c,int[]x)

{

int n=w.length-1;

for(int i=1;in;i++) {

if(m[i][c]==m[i+1][c])x[i]=0;

else {

x[i]=1;

c-=w[i];

}

x[n]=(m[n][c]0)?1:0;

}

//int n=w.length-1;

for(int i=1;in;i++)

if(m[i][c]==m[i+1][c])x[i]=0;

else {

x[i]=1;

c-=w[i];

}

x[n]=(m[n][c]0)?1:0;

}

求動態規劃0-1背包算法解釋

01背包問題

題目

有N件物品和一個容量為V的背包。第i件物品的費用是c[i],價值是w[i]。求解將哪些物品裝入背包可使價值總和最大。

基本思路

這是最基礎的背包問題,特點是:每種物品僅有一件,可以選擇放或不放。

用子問題定義狀態:即f[i][v]表示前i件物品恰放入一個容量為v的背包可以獲得的最大價值。則其狀態轉移方程便是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

這個方程非常重要,基本上所有跟背包相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下:“將前i件物品放入容量為v的背包中”這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化為一個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化為“前i-1件物 品放入容量為v的背包中”,價值為f[i-1][v];如果放第i件物品,那麼問題就轉化為“前i-1件物品放入剩下的容量為v-c[i]的背包中”,此時能獲得的最大價值就是f[i-1][v-c[i]]再加上通過放入第i件物品獲得的價值w[i]。

優化空間複雜度

以上方法的時間和空間複雜度均為O(VN),其中時間複雜度應該已經不能再優化了,但空間複雜度卻可以優化到O。

先考慮上面講的基本思路如何實現,肯定是有一個主循環i=1..N,每次算出來二維數組f[i][0..V]的所有值。那麼,如果只用一個數組 f[0..V],能不能保證第i次循環結束後f[v]中表示的就是我們定義的狀態f[i][v]呢?f[i][v]是由f[i-1][v]和f[i-1] [v-c[i]]兩個子問題遞推而來,能否保證在推f[i][v]時(也即在第i次主循環中推f[v]時)能夠得到f[i-1][v]和f[i-1] [v-c[i]]的值呢?事實上,這要求在每次主循環中我們以v=V..0的順序推f[v],這樣才能保證推f[v]時f[v-c[i]]保存的是狀態 f[i-1][v-c[i]]的值。偽代碼如下:

for i=1..N

for v=V..0

f[v]=max{f[v],f[v-c[i]]+w[i]};

其中的f[v]=max{f[v],f[v-c[i]]}一句恰就相當於我們的轉移方程f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]},因為現在的f[v-c[i]]就相當於原來的f[i-1][v-c[i]]。如果將v的循環順序從上面的逆序改成順序的話,那麼則成了f[i][v]由f[i][v-c[i]]推知,與本題意不符,但它卻是另一個重要的背包問題P02最簡捷的解決方案,故學習只用一維數組解01背包問題是十分必要的。

事實上,使用一維數組解01背包的程序在後面會被多次用到,所以這裡抽象出一個處理一件01背包中的物品過程,以後的代碼中直接調用不加說明。

過程ZeroOnePack,表示處理一件01背包中的物品,兩個參數cost、weight分別表明這件物品的費用和價值。

procedure ZeroOnePack(cost,weight)

for v=V..cost

f[v]=max{f[v],f[v-cost]+weight}

注意這個過程里的處理與前面給出的偽代碼有所不同。前面的示例程序寫成v=V..0是為了在程序中體現每個狀態都按照方程求解了,避免不必要的思維複雜度。而這裡既然已經抽象成看作黑箱的過程了,就可以加入優化。費用為cost的物品不會影響狀態f[0..cost-1],這是顯然的。

有了這個過程以後,01背包問題的偽代碼就可以這樣寫:

for i=1..N

ZeroOnePack(c[i],w[i]);

初始化的細節問題

我們看到的求最優解的背包問題題目中,事實上有兩種不太相同的問法。有的題目要求“恰好裝滿背包”時的最優解,有的題目則並沒有要求必須把背包裝滿。一種區別這兩種問法的實現方法是在初始化的時候有所不同。

如果是第一種問法,要求恰好裝滿背包,那麼在初始化時除了f[0]為0其它f[1..V]均設為-∞,這樣就可以保證最終得到的f[N]是一種恰好裝滿背包的最優解。

如果並沒有要求必須把背包裝滿,而是只希望價格盡量大,初始化時應該將f[0..V]全部設為0。

為什麼呢?可以這樣理解:初始化的f數組事實上就是在沒有任何物品可以放入背包時的合法狀態。如果要求背包恰好裝滿,那麼此時只有容量為0的背包可能被價值為0的nothing“恰好裝滿”,其它容量的背包均沒有合法的解,屬於未定義的狀態,它們的值就都應該是-∞了。如果背包並非必須被裝滿,那麼 任何容量的背包都有一個合法解“什麼都不裝”,這個解的價值為0,所以初始時狀態的值也就全部為0了。

這個小技巧完全可以推廣到其它類型的背包問題,後面也就不再對進行狀態轉移之前的初始化進行講解。

一個常數優化

前面的偽代碼中有 for v=V..1,可以將這個循環的下限進行改進。

由於只需要最後f[v]的值,倒推前一個物品,其實只要知道f[v-w[n]]即可。以此類推,對以第j個背包,其實只需要知道到f[v-sum{w[j..n]}]即可,即代碼中的

for i=1..N

for v=V..0

可以改成

for i=1..n

bound=max{V-sum{w[i..n]},c[i]}

for v=V..bound

這對於V比較大時是有用的。

小結

01背包問題是最基本的背包問題,它包含了背包問題中設計狀態、方程的最基本思想,另外,別的類型的背包問題往往也可以轉換成01背包問題求解。故一定要仔細體會上面基本思路的得出方法,狀態轉移方程的意義,以及最後怎樣優化的空間複雜度。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/186959.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-27 13:33
下一篇 2024-11-27 13:33

相關推薦

  • QML 動態加載實踐

    探討 QML 框架下動態加載實現的方法和技巧。 一、實現動態加載的方法 QML 支持從 JavaScript 中動態指定需要加載的 QML 組件,並放置到運行時指定的位置。這種技術…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的“畫筆”在窗口中繪製…

    編程 2025-04-29

發表回復

登錄後才能評論