@

题目 【80分】

你有一架天平和N个砝码,这N个砝码重量依次是W1,W2,……,WN请你计算一共可以称出多少种不同的重量?

注意砝码可以放在天平两边。

【样例输入】

3

1 4 6

【样例输出】

10

思路

这是一道动态规划题

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

知识点

将dp初始化为0,二维数组

对于第一个加入的dp[i][array[0]]=1标记为能称出的重量

最终dp:

[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

第一次加入1,所以在dp[0,1] 这里标记为1

[0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0]

第二次加入4,所以在dp[1][4] 这里标记为1,之前的状态为dp[0][1]也是为1,之后在加入4之后;4+1=5,所以dp[1][5]标记为1,abs(1-4)==3,所以dp[1][3]也标记为1;

[0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1]

同理:

所以最后求解个数的时候只需要将求解dp数组最后一行有多少个1,也就能得出答案

思路是没问题,不过这道题最后两个测试样例超时了只有80分

代码


n = int(input())
array = list(map(int, input().split())) sum = sum(array)
a_len = len(array)
ans = 0
dp = [[0 for i in range(sum+1)] for j in range(a_len)] dp[0][array[0]]=1 # no1 for i in range(1,a_len):
for j in range(1,sum+1):
dp[i][j]=dp[i-1][j] # copy 对于当前的复制前一个的重量
dp[i][array[i]]=1 # 当前状态是可称的
for j in range(1, sum+1): # 最大重量为所有砝码重量总和
if(dp[i-1][j]): #pre=1 上一个状态的重量
dp[i][j+array[i]] = 1 # 上一状态的重量在加上当前重量
dp[i][abs(j-array[i])]=1 # 上一个状态的重量减去当前状态的重量 for i in range(1,sum+1):
if(dp[n-1][i]):
ans += 1 print(ans)

最新文章

  1. 如何隐藏DIV对象
  2. 1250 Super Fast Fourier Transform(湘潭邀请赛 暴力 思维)
  3. 网络编程之addrinfo
  4. c++源文件后缀名
  5. excel 转换日期
  6. OD18
  7. 搭建emacs的go编程语言环境
  8. Arduino101学习笔记(二)—— 一些注意的语法点
  9. 自定义uiview 当没有数据的时候 显示自定义的uiview界面
  10. jQuery中的插件的编写和使用
  11. iOS开发之基于parse的登录注册
  12. transactionscope报“此操作对该事务的状态无效”问题
  13. Java面试题-2
  14. 【.NET Core项目实战-统一认证平台】第二章网关篇-定制Ocelot来满足需求
  15. IOI2008 island
  16. 野(wild)指针与悬空(dangling)指针
  17. Anaconda 执行命令报ssl错误
  18. CssSelector之selenium元素定位
  19. 几种常见web 容器比较
  20. Atitit.软件开发的几大规则,法则,与原则。。。attilax总结

热门文章

  1. Debugging and Running MPI in Xcode
  2. PC端申请表
  3. 学习java的第二十五天
  4. addict, address, adequate
  5. c#中实现串口通信的几种方法
  6. 内存管理——placement new
  7. HTML样式 背景
  8. zabbix之监控MySQL
  9. 理解inode以及软硬连接,和inode磁盘爆满的解决方案以及文件权限
  10. Java学习1:图解Java内存分析详解(实例)