0-1背包问题
题目
有 N 件物品和一个承重为 C 的背包(也可定义为体积),每件物品的重量是 wi,价值是 pi,求解将哪几件物品装入背包可使这些物品在重量总和不超过 C 的情况下价值总和最大。这个问题隐含了一个条件,每个物品只有一件,也就是限定每件物品只能选择 0 个或 1 个,因此又被称为 0-1 背包问题。
分析
若采用遍历的方法,将所有情况都计算出来,再找最优解,但是很耗费时间我们都知道,可以把此前遍历时已经计算过的量储存起来,当我们需要的时候直接提取它的结果,就起到了减少计算量的效果,我们的动态规划使用的就是这种思想。
此前对动态规划思想了解甚少,此次借阅了其他同学的思想,此后有时间多多钻研。
代码
def max(m,n):
if(m>n):
return m
if(m<n):
return n
def max1(m,n):
if(m<n):
return true
if(m>n):
return false
def best(m,list1,list2,n):
r=[[0 for i in range(n)] for i in range(m+1)];
for i in range(m+1):
for j in range(n):
r[i][j]=0
for i in range(1,m+1):
for j in range(1,n):
r[i][j] = r[i][j-1]
if(i>=list1[j]):
r[i][j]=max(r[i][j-1],r[i-list1[j]][j-1]+list2[j])
return r[m][n-1];
if __name__ =="__main__":
m= 0;
print"请输入最大重量"
m = input()
print"请输入一组物品的总数量"
n=input()
n=n+1
list1 = [0 for i in range(n)]
list2 = [0 for i in range(n)]
print"请依次输入物品的质量"
for i in range(1, n):
list1[i] = int(input())
print"请依次输入物品的价值"
for i in range(1, n):
list2[i] = int(input())
list3[i]=0
q=best(m,list1,list2,n)
print q
Leetcode (132)
题目
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的最少分割次数。
分析
代码
class Solution(object):
def minCut(self, s):
"""
:type s: str
:rtype: int
"""
dp=[0 for i in range(len(s)+1)]
p=[[False for i in range(len(s))] for j in range(len(s))]
for i in range(len(s)+1):
dp[i]=len(s)-i
for i in reversed(range(len(s))):
for j in range(i,len(s)):
if s[i]==s[j] and (j-i<2 or p[i+1][j-1]==True):
p[i][j]=True
dp[i]=min(dp[i],dp[j+1]+1)
return dp[0]-1
学习总结
一周的编程集训,让自己了解了许多数据结构和算法,部分是以前上课学过,在python进行了实现,也有部分是从未接触过,全新的知识。收获很大,这种互相监督+自我督促的模式真的很nice,可惜恰逢期末考,所以投入的时间极其有限,自己做的不够好。