在这种情况下,哪种数据结构和算法最好

时间:2015-04-08 00:11:49

标签: algorithm data-structures

让我们说一堆水果,每个都有营养价值和价格标签,我需要选择一组水果,可以提供最好的总营养价值和费用限制。例如,我需要选择5种不同的水果,并且不能使其总价值达到50美元,以获得最佳的总营养价值。

2 个答案:

答案 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(我认为您应该在完全掌握主要解决方案之后尝试)