0-1背包问题:
有 N 件物品和一个承重为 C 的背包(也可定义为体积),每件物品的重量是 wi,价值是 pi,求解将哪几件物品装入背包可使这些物品在重量总和不超过 C 的情况下价值总和最大。这个问题隐含了一个条件,每个物品只有一件,也就是限定每件物品只能选择 0 个或 1 个,因此又被称为 0-1 背包问题。
遍历之所以耗费时间,是由于它的计算量巨大,我们通过观察它的计算过程可以发现,其实它的很多计算操作计算的都是之前计算过的量。那我们如果把这些已经计算过的量储存起来,当我们需要的适合直接提取它的结果,就起到了减少计算量的效果,动态规划使用的就是这种思想。
下面代码:最重要的部分就是best函数。
首先它创建了一个m+1行n列的数组,用于存储我们已经计算过的数据,r[m][n-1]的意思就是当背包最大重量为m、物品为前n个时,能装下的物品总价格最高的值。(要注意到我们在主函数输入n之后将n加1一次,这么做是为了方便计算,把n加1后可以留出来n=0的位置表示没有物品时的最优解的值)
接下来我们把r数组初始化为0,然后,运用动态规划的基本思想,先限制一个背包的最大重量,再挨个的增加物品数量,求它的最大值。
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
leetcode132. Palindrome Partitioning II
题目
Given a string s, partition s such that every substring of the partition is a palindrome.
Return the minimum cuts needed for a palindrome partitioning of s.
Example:
Input: "aab"
Output: 1
Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.
思路
二重动态规划,一个用来记录p[i][j]判断s[i][j]是否回文字符串,另外一个ans[i]代表s[:i]的最小cut是多少。如果s[i :j]是回文字符串,那么ans[j] = min(ans[j],ans[i - 1] + 1)。
class Solution(object):
def minCut(self, s):
"""
:type s: str
:rtype: int
"""
size = len(s)
ans = [i for i in range(size)]
p = [[False for i in range(size)] for j in range(size)]
j = 1
while j < size:
i,ans[j] = j - 1,min(ans[j],ans[j - 1] + 1)
p[j][j] = True
while i >= 0:
if s[i] == s[j] and ((j - i) < 2 or p[i+1][j-1]):
p[i][j] = True
if i == 0:
ans[j] = 0
else:
ans[j] = min(ans[j],ans[i - 1] + 1)
i -= 1
j += 1
return ans[size - 1]