【发布时间】:2020-05-04 17:38:21
【问题描述】:
给定一根长度为 n 英寸的棒和一个价格数组,其中包含所有尺寸小于 n 的块的价格。确定要进行削减以实现最大利润的位置。
我需要帮助我们如何解决这个问题?
【问题讨论】:
-
任何示例测试用例?
-
这只是knapsack problem,用长度代替重量,用价格来代表价值。
标签: algorithm dynamic-programming
给定一根长度为 n 英寸的棒和一个价格数组,其中包含所有尺寸小于 n 的块的价格。确定要进行削减以实现最大利润的位置。
我需要帮助我们如何解决这个问题?
【问题讨论】:
标签: algorithm dynamic-programming
一个简单的递归就可以解决这个问题:
#include <algorithm>
#include <climits>
int maxPrice(int prices[], int n) {
if (n <= 0) return 0;
int ans = INT_MIN;
for (int i = 0; i < n; i++)
ans = std::max(ans, prices[i] + maxPrice(prices, n - i - 1));
return ans;
}
int main(){
//size: 1 2 3 4 5 6 7 8
int prices[] = {1, 3, 4, 8, 9, 11, 11, 16};
std::cout<<maxPrice(prices, 8)<<std::endl;
return 0;
}
另一方面,这个解决方案很慢。最好的选择是采用背包问题方法:假设您有一个大小为 n 的背包,并且每件大小(或在这种情况下为重量)i 成本 p[i],然后像普通背包一样填充矩阵。我们的想法是预处理每个尺寸的最优惠价格,直到 n。
【讨论】:
#include <bits/stdc++.h>是正确的方法。已经有足够多的糟糕的 C++ 教师教授糟糕的实践。写两个合适的标准库#include 行真的那么难吗?