C++ 确定最大乐趣的算法

C++ 确定最大乐趣的算法,c++,algorithm,C++,Algorithm,问题本身是可以发现的。要点是贝西正在坐过山车,但她会头晕。在不超过“眩晕极限”的情况下,她能拥有的最大乐趣是什么 输入包括: “N K L 式中N(1)≤ N≤ 1000)是过山车在这一特殊情况下的节数;K(1)≤ K≤ 500)是Bessie如果闭上眼睛观察骑乘的任何部分,眩晕程度将下降的量;和L(1)≤ L≤ 30万)是贝茜能忍受的头晕极限——如果她的头晕超过我,贝茜就会生病,这可不是好玩的 接下来的N行中的每一行都有两个整数: fd 式中F(1)≤ F≤ 20) 如果shell一直盯着那个

问题本身是可以发现的。要点是贝西正在坐过山车,但她会头晕。在不超过“眩晕极限”的情况下,她能拥有的最大乐趣是什么 输入包括:

“N K L

式中N(1)≤ N≤ 1000)是过山车在这一特殊情况下的节数;K(1)≤ K≤ 500)是Bessie如果闭上眼睛观察骑乘的任何部分,眩晕程度将下降的量;和L(1)≤ L≤ 30万)是贝茜能忍受的头晕极限——如果她的头晕超过我,贝茜就会生病,这可不是好玩的

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

fd

式中F(1)≤ F≤ 20) 如果shell一直盯着那个部分,那么Bessie得到的全部乐趣增加了吗≤ 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;
            }
cin>>N;//部分
cin>>K;//头晕的程度可以降低
cin>>L;//眩晕天花板
belowL=L;//设置左侧头晕的数量
对于(int i=0;i>D;//乐趣增加,头晕增加
如果(D<以下){
如果(F>=D){
funTotal+=F;
}
}
否则{
低于WL-=K;
}
然而,这并不总是产生正确的结果。问题是什么?它应该选择有趣的选项,除非它会让贝西超过疾病阈值。有更好的方法吗

它应该选择一个有趣的选项,除非它会让贝西胜出 疾病阈值。有更好的方法吗

问题是,你没有最大限度地发挥这里的乐趣,你只是在防止贝西生病。当你到达一个会让她晕眩的区域时,你可以通过回溯并在前一个区域中选择“不好玩”选项来增加更多乐趣。假设你有这样的输入,按F D顺序:

1 400
5 450
10 25
18 75
20 400
此外,假设她已经接近头晕极限,当她到达上面的第一部分时。你可以在前两部分选择有趣的选项,F增加6,D增加850。也许这使她处于极限。现在你别无选择,只能在后续部分选择不有趣的选项。另一方面,如果在前两个部分中,你选择了不有趣的选项,在接下来的三个部分中,你可以选择有趣的选项,F值增加48,D值只增加500


如果F:D比大于1,并且你有足够的眩晕能力,那么你的当前算法是有趣的选择。这是合理的,但不是最优的。很可能没有固定的比率会给出最佳的解决方案。相反,你需要考虑每一个选项的好处和成本。

< P>,而不是给你代码。这是对问题解决方案的一种解释

基本方法是使用动态规划来解决问题,因为这会减少到所谓的a。这样想,她的头晕是她一次能在袋子里装多少东西,而乐趣是她想最大化的(与她在袋子里装的“物品”的价值相比).现在我们想做的是从过山车中获得最大的乐趣(口袋里最值钱的东西),而不会让她太头晕(超过袋子上的“重量”限制)

因此,现在您要选择她眼睛睁开/闭着的部分(无论物品是否在袋子中)。因此,一个简单的方法是选择两个选项中的最大值。如果她可以睁大眼睛而不超过阈值,或者是否只闭上眼睛。但现在问题发生了变化,你可以看到如果她睁大眼睛,她的diziness阈值将降低(更容易解决子问题)

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

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


p.S我在这个问题被提出并解决的地区,很高兴再次看到这个问题

我很好奇为什么有人投票关闭这个问题,它的措辞很好,并且与原始问题也有联系。p:我没有时间读它,但如果我读了,它看起来像是一个有趣的问题!你应该寻找maxi的方法使总体乐趣最大化,但目前你只是想尽快获得更多乐趣。这让我想起了。我喜欢客人从过山车上下来,在人行道上呕吐。似乎有很多可能的输入,你可以获得最大乐趣(F=20)和低于平均眩晕(D<250)并且仍然选择不把乐趣加到乐趣总数中,同时也不闭上眼睛来恢复头晕。这就是“0-1背包问题”,这是一个可搜索的术语。