谈判&&回路计数

题目

在很久很久以前,有n 个部落居住在平原上,依次编号为 1到n。第i 个部落的人数为ti​。

有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。

每次谈判,小蓝只能邀请两个部落参加,花费的金币数量为两个部落的人数之和,谈判的效果是两个部落联合成一个部落(人数为原来两个部落的人数之和)。

输出一个整数,表示最小花费。

思路

跟之前有个题目很像,老师给学生答疑花费时间最小那个。 花费金币为两部落人数之和,因此最先合并的部落里的人会一直花金币到最后。花费最小也就是将最小部落的最先进行谈判合并,可以使用暴力去每次对最小的两个数进行相加,记录和(也就是所花费金币数)。另外可以进行找规律:比如9 1 3 5 ,31 = 1 * 3 + 3 * 3 + 5 * 2 + 9 * 1 

代码

import os
import sys

# 请在此输入您的代码
n = int(input())
datas = list(map(int, input().split()))
new_data = sorted(datas)
# money = 0
# while(len(new_data) > 1):
#   a = new_data[0]
#   b = new_data[1]
#   new_data.remove(a)
#   new_data.remove(b)
#   money += a + b
#   new_data.append(a+b)
#   new_data = sorted(new_data)

# print(money)
# 1 3 5 9 中 money = 1 * 3 + 3 * 3 + 5 * 2 + 9 * 1 = 31
nums = len(new_data) - 1
money = 0
i = 0
while(nums > 0):
  money += new_data[i] * nums
  if i == 0: # 前面最小的两个数都是 * 3
    i += 1
    continue
  else:
    nums -= 1
    i += 1
print(money)


题目

蓝桥学院由21​​​ 栋教学楼组成,教学楼编号 1到21​​。对于两栋教学楼 a​​ 和 b​,当 a​ 和b​ 互质时,a 和b 之间有一条走廊直接相连,两个方向皆可通行,否则没有直接连接的走廊。

小蓝现在在第一栋教学楼,他想要访问每栋教学楼正好一次,最终回到第一栋教学楼(即走一条哈密尔顿回路),请问他有多少种不同的访问方案?

两个访问方案不同是指存在某个 i,小蓝在两个访问方法中访问完教学楼 i 后访问了不同的教学楼。

思路

 不太懂,直接看的题解。这里更详细一点:蓝桥杯.回路计数(状压DP)_UmVfX1BvaW50的博客-CSDN博客 

代码

import os
import sys

# 请在此输入您的代码
import math
n = 21
# 每个数与1都互质 即每栋楼都能直达1号教学楼
state = 1<<21 # <<右移运算符 使用21位二进制数来表示这些楼是否被访问过 当state全为1时 则表示一种寻路方案
# 存放教学楼之间是否有路径
Map = [[0]*(n+1) for i in range(n+1)]

dp = [[0]*n for i in range(state)]
dp[1][0] = 1 # 只访问1号楼

for i in range(n+1):
    for j in range(n+1):
        if math.gcd(i,j)==1:
            Map[i][j] = 1
            
for i in range(state):
    for j in range(n):
        if i>>j & 1: #  (状态 i 按位右移j位,之后取余) (判断状态 i 二进制数的第 j 位是否为1) j这栋楼是不是访问过
            for k in range(n):
                if Map[k+1][j+1] == 1 and i>>k &1:
                    dp[i][j] +=dp[i-(1<<j)][k]
                
print(sum(dp[-1])-dp[-1][0])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值