题目
一根X米长的树木,伐木工切割成不同长度的木材后进行交易,交易价格为每根木头长度的乘积。规定切割后的每根木头长度都为
正整数,也可以不切割,直接拿整根树木进行交易。请问伐木工如何尽量少的切割,才能使收益最大化?
输入描述:
木材的长度(X<=50)
输出描述:
输出最优收益时的各个树木长度,以空格分割,按升序排列
示例1
输入
10
输出
3 34
说明:
1.一根2米长的树木,伐木工不切割,为2* 1,收益最大为2
2.一根4米长的树木,伐木工不需要切割为2*2,省去切割成本,直接整根树木交易,为4*1,收益最大为4
3.一根5米长的树木,
伐木工切割为2*3,收益最大为 6
4.一根10米长的树木,伐木工可以切割为方式: 3,4.3,也可以切割为方式二:3.2,2.3,但方式二代木工多切割了一次增加切割成
本却卖了一样的价格,因此并不是最优收益。
思路
1: 收益类的问题,包括股票交易Q 类题目,可以直接按照贪心算法
代码
import functools
import sys
import copy
import re
import math
n =int(input())
cache = [0 for i in range(n+1)]
cache[0] = 0
memory = [[] for i in range(n+1) ]
for i in range(1,n+1):
memory[i].append(i)
cache[i] = i
i=1
while(True):
if(i>n):
break
else :
for j in range(1, i):
if(cache[i] > cache[j] * cache[i - j]):
continue
elif(cache[i] < cache[j] * cache[i - j]):
cache[i] = cache[j] * cache[i - j]
memory[i] = []
for k in range(len(memory[j])):
memory[i].append(memory[j][k])
for k in range(len(memory[i-j])):
memory[i].append(memory[i-j][k])
else :
if(len(memory[i]) > len(memory[j]) + len(memory[i-j])):
memory[i] = []
for k in range(len(memory[j])):
memory[i].append(memory[j][k])
for k in range(len(memory[i-j])):
memory[i].append(memory[i-j][k])
i+=1
result = memory[n]
result.sort()
output_str = ""
for j in range(len(result)):
output_str += str(result[j]) + " "
print(output_str)