PTA 演算法練習題 回溯

2021-10-12 09:35:07 字數 3698 閱讀 3955

1.最佳排程問題

假設有n(n<=20)個任務由k(k<=20)個可並行工作的機器完成。完成任務i需要的時間為ti。 試設計乙個演算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti ,i=1~n。計算完成這n個任務的最佳排程,使得完成全部任務的時間最早。

輸入格式:

輸入資料的第一行有2 個正整數n和k。第2 行的n個正整數是完成n個任務需要的時間。

輸出格式:

將計算出的完成全部任務的最早時間輸出到螢幕。

輸入樣例:

在這裡給出一組輸入。例如:

7 32 14 4 16 6 5 3

輸出樣例:

在這裡給出相應的輸出。例如:

17**:

#include

#include

using namespace std;

const int n = 1005;

int n,k,a[n],b[n],ans=0x7fffffff;

void dfs(int x,int tot) else

cout << 「.」;

if (j != n - 1) else }}

memset(map, 0, sizeof(map)); //還原

} else

for (int i = 0; i < n; i++) //嘗試在 cur行的 各 列 放置皇后}}

int main()

// printf("%d %d\n",sum,cnt);//輸出 解決方案 和 遞迴次數

return 0;

}3.0-1揹包問題

給定n(n<=100)種物品和乙個揹包。物品i的重量是wi,價值為vi,揹包的容量為c(c<=1000)。問:應如何選擇裝入揹包中的物品,使得裝入揹包中物品的總價值最大? 在選擇裝入揹包的物品時,對每種物品i只有兩個選擇:裝入或不裝入。不能將物品i裝入多次,也不能只裝入部分物品i。

輸入格式:

共有n+1行輸入: 第一行為n值和c值,表示n件物品和揹包容量c; 接下來的n行,每行有兩個資料,分別表示第i(1≤i≤n)件物品的重量和價值。

輸出格式:

輸出裝入揹包中物品的最大總價值。

輸入樣例:

在這裡給出一組輸入。例如:

5 10

2 62 3

6 55 4

4 6輸出樣例:

在這裡給出相應的輸出。例如:

15執行**:

#include

using namespace std;

int main();

for(int i=1;cin>>w[i]>>v[i];i++);

for(int i=1;i<=n;i++)

}cout<4.整數拆分問題

將乙個正整數拆分成若干個正整數的和。

輸入格式:

乙個正整數n

輸出格式:

若干行,每行乙個等式(每個數或者等號間都有乙個空格,第乙個數前沒有空格,最後乙個數後面沒有空格,數與數之間要求非降序排列)。最後一行給出解的總個數

輸入樣例:

在這裡給出一組輸入。例如:

4輸出樣例:

在這裡給出相應的輸出。例如:

4 = 1 + 1 + 1 + 1

4 = 1 + 1 + 2

4 = 1 + 3

4 = 2 + 2

4執行**:

#include

#include

using namespace std;

int n, num;

vector v;

void dfs(int k, int sum)

cout << endl;

num++;

return;

}for(int i = k; i < n; i++)

}int main()

5.666問題

小明有一張m*n的好習慣記錄卡,記錄每一天的好習慣目標達成度(數字0-9表示)。某天目標完成達成,就在當天的格仔裡寫上數字6,目標沒有完全達成就寫上乙個小於6的數字(0-5),目標超額完成就寫上乙個大於6的數字(7-9)。記錄卡上如果能找到一條長度為3的路徑並且路徑上的三個數字都大於等於6(這裡的路徑是指從某個格仔出發,可以向左、右、上、下格仔移動,並且不能重複經過乙個格仔),則小明就能得到乙個「666」獎勵。

請你幫小明統計下他總共能得到多少「666」獎勵。

輸入格式:

輸入第一行給出兩個正整數m,n(1=輸出格式:

先輸出m行,每行包括n個整數,代表從當前格仔出發得到的「666」獎勵個數,中間用空格分割,最後乙個數字後面不帶空格。然後再在下一行輸出得到的「666」獎勵總數。

輸入樣例:

3 36 6 7

3 8 3

7 9 5

輸出樣例:

2 1 2

0 3 0

1 1 0

10執行**

#include

using namespace std;

int resource[102][102];//輸入陣列

int result[102][102];//儲存結果的陣列

int n, m;//m行,每行n個數

int backtrack(int i,int j,int undergoing,int direction)

else

}

if (resource[i+1][j] >= 6 && direction != 4)

else

}if (resource[i][j - 1] >= 6 && direction != 1)

else

}if (resource[i-1][j] >= 6 && direction != 2)

else

}if (undergoing == 2)

else

int main()

}for (int i = 1; i <= m; i++)

}for (int i = 1; i <= m; i++)

sum += result[i][j];

}cout << endl;

}cout << sum << endl;

return 0;

}6.工作分配問題

設有n件工作分配給n個人。將工作i分配給第j個人所需的費用為cij 。 設計乙個演算法,對於給定的工作費用,為每乙個人都分配1 件不同的工作,並使總費用達到最小。

輸入格式:

輸入資料的第一行有1 個正整數n (1≤n≤20)。接下來的n行,每行n個數,表示工作費用。

輸出格式:

將計算出的最小總費用輸出到螢幕。

輸入樣例:

在這裡給出一組輸入。例如:

310 2 3

2 3 4

3 4 5

輸出樣例:

在這裡給出相應的輸出。例如:

9執行**:

#include

#include

#include

using namespace std;

int a[100][100],sum,minn,i,j,n;

bool b[100];

void dfs(int dep)

PTA練習題 旅遊規劃

有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度 以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。輸入格式 輸入說明 輸入資料的第1行給出4個正整數n m s d,其中n 2 n 50...

演算法練習題

題目描述 給定乙個排序陣列,你需要在 原地 刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。不要使用額外的陣列空間,你必須在 原地 修改輸入陣列 並在使用 o 1 額外空間的條件下完成。示例 1 給定陣列 nums 1,1,2 函式應該返回新的長度 2,並且原陣列 nums 的前...

PTA練習題 樹的同構

在網上做了一道簡單的練習題,判斷兩棵樹是否同構 題目描述 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。輸入格式 輸入給出2棵...