让我们说一堆水果,每个都有营养价值和价格标签,我需要选择一组水果,可以提供最好的总营养价值和费用限制。例如,我需要选择5种不同的水果,并且不能使其总价值达到50美元,以获得最佳的总营养价值。
答案 0 :(得分:1)
它基本上是着名的0-1 Knapsack Problem,可以通过动态编程来解决。
以下是背包问题的引用:
给定一组具有质量和值的项目,确定要包含在集合中的每个项目的数量,以使总权重小于或等于给定限制,并且总值与可能的。
这意味着在你的情况下,
这些项目是水果
价值是营养价值
质量是金钱
让m_i,v_i成为第i个水果的金钱和营养价值
定义DP(i,w)是表示从第一个i果实中选择的最大总值的状态,使用的总金额< = w
填写基本情况,即所有x
的DP(0,x)然后使用以下转换进行动态编程
DP(i,w)= DP(i-1,w),如果m_i> w(你可以认为一个人没有采取第i个成果)
DP(i,w)= max(DP(i-1,w),DP(i-1,w-m_i)+ v_i)如果m_i <= w(你可以认为是一个如果不选择第i种水果或选择它,我们会选择具有更大价值的选项
如果 DP(n-1,50)使用0-base
,那么你的回答答案 1 :(得分:0)
此问题没有数据结构。您正在寻找的算法是0-1背包问题。请参阅here
该算法基本归结为递归。对于每种水果,你要么吃这种水果,要么留下它(0-1)。这样你就会产生水果的所有子集,并在其中发挥最大的作用。
int knapSack(int W, int wt[], int val[], int n)
{
// Base Case
if (n == 0 || W == 0)
return 0;
// If weight of the nth item is more than Knapsack capacity W, then
// this item cannot be included in the optimal solution
if (wt[n-1] > W)
return knapSack(W, wt, val, n-1);
// Return the maximum of two cases: (1) nth item included (2) not included
else return max( val[n-1] + knapSack(W-wt[n-1], wt, val, n-1),
knapSack(W, wt, val, n-1)
);
}
您之后可以申请DP(我认为您应该在完全掌握主要解决方案之后尝试)