2023年秋季学期《算法分析与设计》练习16 OJ-1425 算法分析与设计练习16,使用python
N皇后问题
使用回溯法求解N后问题。
?
输入
皇后的个数。
输出
每一种方案及总方案数。
样例输入?Copy
4
样例输出?Copy
0 1 0 0 0 0 0 2 3 0 0 0 0 0 4 0 ---------------- 0 0 1 0 2 0 0 0 0 0 0 3 0 4 0 0 ---------------- 总方案数为:2
def dfs(row, n):
global count
if row == n:
for i in range(n):
for j in range(len(res[i])):
print(res[i][j], end=" ")
print()
print("----------------")
count += 1
for j in range(n):
if col[j] and dg[j + row] and udg[j + n - row]:
col[j], dg[j + row], udg[j + n - row] = False, False, False
res[row][j] = row+1
dfs(row + 1, n)
col[j], dg[j + row], udg[j + n - row] = True, True, True
res[row][j] = 0
n = int(input())
col = [True] * n
dg, udg = [True] * (2 * n), [True] * (2 * n)
res = [[0] * n for _ in range(n)]
count = 0
dfs(0, n)
print("总方案数为:"+str(count))
?0-1背包问题(回溯法)
题目描述
有n个物品,第i个物品重量为wi,价值为vi,现有一背包容量为C,要求把物品装入背包得到最大价值,并且要求出这些选取的物品。 要求用回溯法求解。
输入
多组测试数据,请处理到文件尾,一个整数表示物品的数量n,后一行有n个整数,代表价值,再后一行有n个整数,代表重量,最后有一个整数C代表背包容量,1<=n<=15,1<=vi<=30,1<=wi<=30,1<=C<=80。
输出
背包的最大总价值和所选取的物品,如果选取的方案有多种,请输出字典序最小的那种方案,每组测试数据应输出一行,在这里字典序最小的意思是,我们假设存在两种不同方案S,T所能得到的总价值相同且是最大的,对于方案S种选取|S|种物品,方案T选取|T|种物品,对于i=1,2...j-1,我们有si = ti,但sj < tj,则方案的S的字典序比方案T的字典序要小。由于没有使用special judge,所以如果选取得方案是S,请按照从小到大的顺序输出方案S中的物品下标。
样例输入?Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">5
6 3 6 5 4
2 2 4 6 5
8</span></span></span></span>
样例输出?Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">15 1 2 3</span></span></span></span>
def slove(w, v, c, n, m):
jMAX = min(w[n - 1] - 1, c)
for j in range(0, jMAX + 1):
m[n - 1][j] = 0
for j in range(w[n - 1], c + 1):
m[n - 1][j] = v[n - 1]
for i in range(n - 1, -1, -1):
jMAX = min(w[i] - 1, c)
for j in range(0, jMAX + 1):
m[i][j] = m[i + 1][j]
for j in range(w[i], c + 1):
m[i][j] = max(m[i + 1][j], m[i + 1][j - w[i]] + v[i])
while True:
n = int(input())
v = list(map(int, input().split()))
w = list(map(int, input().split()))
c = int(input())
m = [[0] * (c + 1) for i in range(n + 1)]
x = []
slove(w, v, c, n, m)
print(m[0][c], end=" ")
for i in range(0, n):
if m[i][c] != m[i + 1][c]:
x.append(i + 1)
c -= w[i]
for i in x:
print(i, end=' ')
print()
?简单递归求和
题目描述
使用递归编写一个程序求如下表达式前n项的计算结果:? (n<=100)
1 -? 3 + 5 - 7 + 9 - 11 +......
输入n,输出表达式的计算结果。
输入
多组输入,每组输入一个n,n<=100。
输出
输出表达式的计算结果。
样例输入?Copy
1 2
样例输出?Copy
1 -2
while True:
n = int(input())
if n <= 100:
flag = 1
sum = 0
for i in range(1, n + 1):
sum += flag * (2 * i - 1)
flag = -1 * flag
print(sum)
?递归求和
题目描述
使用递归编写一个程序求如下表达式的计算结果:? (1<n<=20)
S(n) = 1*4 + 4*9 + 9*16 + 16*25 + ... + ((n-1)^2)*n^2
输入n,输出表达式S(n)的结果。
输入
单组输入,输入一个正整数n,1<n<=20。
输出
输出表达式S(n)的计算结果。
样例输入?Copy
3
样例输出?Copy
40
n = int(input())
sum = 0
if 1 < n <= 20:
for i in range (2, n + 1):
sum += (i - 1) * (i - 1) * i * i
print(sum)
?文件存储
题目描述
如果有n个文件{F1,F2,F3,…,Fn}需要存放在大小为M的U盘中,文件i的大小为Si,1<=i<=n。请设计一个算法来提供一个存储方案,使得U盘中存储的文件数量最多。
输入
多组输入,对于每组测试数据,每1行的第1个数字表示U盘的容量M(以MB为单位,不超过256*1000MB),第2个数字表示待存储的文件个数n。
第2行表示待存储的n个文件的大小(以MB为单位)。
输出
输出最多可以存放的文件个数。
样例输入?Copy
10000 5 2000 1000 5000 3000 4000
样例输出?Copy
4
while True:
m, n = map(int, input().split())
a = list(map(int, input().split()))
count = 0
a.sort()
for i in range(n):
if a[i] <= m:
m -= a[i]
count += 1
print(count)
挑选奖品?
题目描述
X星人参加了一档幸运大抽奖节目,凭借无敌好运气中了一等奖。节目组给他准备了一个奖品箱,这个箱子中一共有M个格子,每个格子中只能放一个奖品。
现在一共有N个不同的奖品供X星人挑选,不同的奖品其价值不一定相等。
“贪心的”X星人希望所挑选的奖品的价值和最大,需要你编写一个程序帮他计算出所能得到的最大价值和。
输入
单组输入。
第1行包含两个正整数M和N,分别表示奖品箱中格子的数量和奖品的总数。(1<?M<=10^5且1<N<=10^5)
第2行包含N个正整数,分别表示N个奖品的价值,两两之间用空格隔开。
输出
奖品箱中所有奖品的最大价值和。
样例输入?Copy
3 5 1 3 2 6 5
样例输出?Copy
14
m, n = map(int, input().split())
a = list(map(int, input().split()))
sum = 0
a.sort(reverse=True)
if m >= n:
for i in range(n):
sum += a[i]
elif m < n:
for i in range(m):
sum += a[i]
print(sum)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!