背包问题

#==============================================================================
# def mybag(n,c,z,v):
#     w = [[0 for i in range(c+1)] for j in range(n+1)]
#     for i in range(n-1,-1,-1):
#         for j in range(1,c+1):
#             if j >= z[i] and w[i+1][j] < w[i+1][j-z[i]] + v[i]:
#                 w[i][j] = w[i+1][j-z[i]] + v[i];
#                 print w
#             else:
#                 w[i][j] = w[i+1][j]
#                 
#     return w
# 
# def asswer(m,n,c,w):
#     x1 = []
#     j = c
#     for i in range(n):
#         if m[i][j] == m[i+1][j]:
#             x1.append(0)
#         else:
#             x1.append(1)
#             j = j - w[i]
#     return x1
# 
# 
# 
# 
# 
# n = 5;
# c = 10
# w = [2,2,6,5,4]
#==============================================================================
#v = [6,3,5,4,6]
#res = mybag(n,c,w,v)
#x = asswer(res,n,c,w)

#sum_time,num_medic = raw_input().split(' ')
#sum_time = int(sum_time)
#num_medic = int(num_medic)
#time_list = []
#values_list =[]
#for i in range(num_medic):
#    time,value = raw_input().split(' ')
#    time_list.append(int(time))
#    values_list.append(int(value))
##==============================================================================
#def bag_medic(sum_time,num_medic,time_list,values_list):
#    w = [[0 for j in range(sum_time+1)] for i in range(num_medic+1)]
#    for i in range(num_medic-1,-1,-1):
#        for j in range(1,sum_time + 1):
#            if j >= time_list[i] and w[i + 1][j] < w[i + 1][j-time_list[i]] + values_list[i]:
#                w[i][j] = w[i + 1][j-time_list[i]] + values_list[i]
#            else:
#                w[i][j] = w[i+1][j]
#            
#    return w
#    
#def find_answer(res,sum_time,num_medic,time_list):
#    j = sum_time
#    x1 = []
#    for i in range(num_medic):
#        if res[i][j] == res[i+1][j]:
#            x1.append(0)
#        else:
#            x1.append(1)
#            j = j - time_list[i]
#    return x1
#def maxValue(x1,values_list):
#    max_value = 0
#    for i in range(len(x1)):
#        max_value += x1[i] * values_list[i]
#    print max_value
##==============================================================================
#    
#res = bag_medic(sum_time,num_medic,time_list,values_list)
#x1 = find_answer(res,sum_time,num_medic,time_list)
#maxValue(x1,values_list)

def bag2(goods_num,bag_weight,values,goods_weight):
    f = [[0 for j in range(bag_weight + 1)] for i in range(goods_num + 1)]
    flag = [[0 for j in range(bag_weight + 1)] for i in range(goods_num + 1)];
    for i in range(1,bag_weight + 1):
        f[1][i] = int(i/goods_weight[0]) * values[0]
        if i < goods_weight[0]:
            flag[1][i] = 0
        else:
            flag[1][i] = 1    
    for k in range(2,goods_num + 1):
        for y in range(1,bag_weight + 1):
            if y >= goods_weight[k-1] and f[k-1][y] <= f[k][y - goods_weight[k-1]] + values[k-1]:
                f[k][y] = f[k][y - goods_weight[k-1]] + values[k-1]
                flag[k][y] = k

            else:
                f[k][y] = f[k-1][y]
                flag[k][y] = flag[k-1][y]
    return f,flag

def find_answer(flag,goods_num,bag_weight,goods_weight):
    j = bag_weight
    x1 = []
    for i in range(goods_num,0,-1):
        if flag[i][j] == i:
            x1.append(1)
            j = j - goods_weight[i-1]
        else:
            x1.append(0)    
    x1.reverse()
    return x1


goods_num = 4
bag_weight = 10
values = [1,3,5,9]
goods_weight = [2,3,4,7]
res,flag = bag2(goods_num,bag_weight,values,goods_weight)
x1 = find_answer(flag,goods_num,bag_weight,goods_weight)

 

posted on 2016-07-28 16:10  Kermit.Li  阅读(137)  评论(0编辑  收藏  举报

导航