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)

  • 31
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值