Submission #1148092

#TimeUsernameProblemLanguageResultExecution timeMemory
1148092aditya_k47Knapsack (NOI18_knapsack)Pypy 3
100 / 100
927 ms129888 KiB
# s,n=map(int,input().split()) # v,w,k=[0]*n,[0]*n,[0]*n # for i in range(n): # v[i],w[i],k[i]=map(int,input().split()) # dp=[-float("inf")]*(s+1) # dp[0]=0 # for i in range(n): import sys def knapsack(limit, type_num, items): by_weight = {} for value, weight, amt in items: if weight <= limit and amt > 0: if weight not in by_weight: by_weight[weight] = [] by_weight[weight].append((value, amt)) best = [[-float('inf')] * (limit + 1) for _ in range(len(by_weight) + 1)] best[0][0] = 0 at = 1 for w, item_list in sorted(by_weight.items()): item_list.sort(reverse=True, key=lambda x: x[0]) # Sort items by value in descending order for i in range(limit + 1): best[at][i] = best[at - 1][i] copies, type_at, curr_used, profit = 0, 0, 0, 0 while (copies + 1) * w <= i and type_at < len(item_list): copies += 1 profit += item_list[type_at][0] if best[at - 1][i - copies * w] != -float('inf'): best[at][i] = max(best[at][i], best[at - 1][i - copies * w] + profit) curr_used += 1 if curr_used == item_list[type_at][1]: curr_used = 0 type_at += 1 at += 1 return max(best[-1]) if __name__ == "__main__": limit, type_num = map(int, sys.stdin.readline().split()) items = [tuple(map(int, sys.stdin.readline().split())) for _ in range(type_num)] print(knapsack(limit, type_num, items))

Compilation message (stdout)

Compiling 'knapsack.py'...

=======
  adding: __main__.pyc (deflated 39%)

=======
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...