c – 确定最大乐趣的算法

问题本身可以找到here.这个要点是Bessie骑着过山车,但是她头昏眼花。没有超过她的“眩晕极限”,她可以获得的最大乐趣是多少?
输入包括:

“N K L

其中N(1≤N≤1000)是这个特定过山车的段数; K(1≤K≤500)如果她在任何一段骑车中闭上眼睛,Bessies头晕水平会下降的量;而L(1≤L≤300,000)是Bessie可以忍受的眩晕的极限 – 如果她的头晕变得比L大,Bessie会生病,这不是乐趣!

接下来的N行中的每一行将有两个整数:

F D

其中F(1≤F≤20)是Bessies总体乐趣的增加,如果她在该部分保持睁开眼睛,D(1≤D≤500)是她的眩晕水平的增加,如果她保持眼睛在该部分打开。这些部分将按顺序列出。“

我的算法解决这个问题看起来像这样:

        cin >> N; // sections
        cin >> K; // amount dizziness can go down
        cin >> L; // dizzy ceiling
        belowL = L; // sets the amount of dizzy left

        for (int i = 0; i < N; i++) {
            cout << "\n" << i;
            cin >> F >> D; // fun increase and dizzy increase
            if (D < belowL) {
                if (F >= D) {
                    funTotal += F;
                }
            }
            else {
                belowL -= K;
            }

但是,这并不总是产生正确的结果。问题是什么?它应该选择有趣的选择,除非它会使Bessie超过疾病阈值。有没有更好的方法呢?

所以,而不是给你这里的代码是解决问题的一种解释。

基本的方法是解决使用动态规划,因为这将减少到所谓的Knapsack problem.以这种方式想像,她的头晕是多少她可以携带在一次袋子,乐趣是她想要最大化(相比之下说她在一个袋子里的“物品”的价值)。现在我们想要做的就是让过山车享受最多的乐趣(最重要的是在袋子里),而不会使她太眩晕(超过麻袋的“重量”)。

所以现在你想选择哪些部分她有她的眼睛打开/关闭(无论一个项目是否在袋中)。所以想到这一点的简单方法是选择两种选择的最大值。如果她能保持眼睛的开放,不要超过门槛,还是闭上眼睛。但现在问题发生了变化,你会看到她是否保持睁开眼睛,呕吐阈值会下降(更容易解决子问题)。

使用这些信息,很容易使背包解决方案适应这个问题,而不必使用回溯或递归。

这个想法是将所有先前解决的子问题保存在矩阵中,以便您可以重用结果,而不是每次重新计算它们。请注意,您可以使用的一个技巧是,您只需要矩阵的当前行和之前解决的一个,因为背包的递归关系只需要这些条目:)

我在这个问题得到解决的地区,很高兴再次看到这个问题

http://stackoverflow.com/questions/9300713/algorithm-to-determine-maximum-fun

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 确定最大乐趣的算法