我该如何修复这个动态编程代码?

问题描述 投票:0回答:1

Polycarpus 有一条丝带,其长度为 n。他希望以满足以下两个条件的方式进行剪彩: 切割后,每条丝带的长度应为 a、b 或 c。 切割后丝带片数应达到最大。 帮助波利卡普斯找到所需切割后的丝带片数。 第一行包含四个空格分隔的整数n、a、b和c(1 ≤ n, a, b, c ≤ 4000)——相应地,原始丝带的长度和切割后丝带片的可接受长度。数字a、b和c可以重合。 打印一个数字——最大可能的色带片数。保证至少存在一次正确的剪彩。

有点简单的代码,但无法处理 45 测试。无法提出反驳此代码的测试。不是TL,错误答案

 #include <iostream>
 #include <cmath>
 #include <algorithm>
 using namespace std;
 int main()
 {
     int n, a, b, c;
     cin >> n;
     cin >> a >> b >> c;
     if (a < b) swap(a, b);
     if (a < c) swap(a, c);
if (b < c) swap(b, c);
     for (int i = 0; i <= n / a; i++)
     {
         for (int j = 0; j <= n / b; j++)
         {
             for (int k = 0; k <= n / c; k++)
             {
                 if (n - (i * a + j * b + k * c) == 0)
                 {
                     int answer=i+j+k;
                     cout << answer;
                     return 0;
                 }
             }
         }
    }
    cout << 0;
    return 0;
}
dynamic-programming
1个回答
0
投票

你的解决方案是错误的,我给你举个例子:

n = 101, a = 50, b = 49, c = 3

因为你的解决方案会因

i = 0, j = 2, k = 1
而中断。

但最好的解决方案是

i = 1, j = 0, k = 17

© www.soinside.com 2019 - 2024. All rights reserved.