Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我在CSES硬币组合2上获得TLE?_C++ - Fatal编程技术网

C++ 为什么我在CSES硬币组合2上获得TLE?

C++ 为什么我在CSES硬币组合2上获得TLE?,c++,C++,我在尝试CSES问题集时遇到了这个动态规划问题。我不知道如何进一步优化它 是指向原始问题的链接 #包括 使用名称空间std; typedef long-long-ll; ll dp[1000005],mod=1e9+7,硬币[105]; int main(){ ios_base::与_stdio同步(false); cin.tie(nullptr); int n,x; cin>>n>>x; 对于(整数i=0;i>硬币[i]; } dp[0]=1; 对于(int j=0;j,根据问题和您的解决方案

我在尝试CSES问题集时遇到了这个动态规划问题。我不知道如何进一步优化它

是指向原始问题的链接

#包括
使用名称空间std;
typedef long-long-ll;
ll dp[1000005],mod=1e9+7,硬币[105];
int main(){
ios_base::与_stdio同步(false);
cin.tie(nullptr);
int n,x;
cin>>n>>x;
对于(整数i=0;i>硬币[i];
}
dp[0]=1;

对于(int j=0;j,根据问题和您的解决方案,
n
可以是100,
x
可以是10^6。 您的解决方案有一个嵌套的for循环,它最终会使程序的复杂度为O(n*x),在最坏的情况下,复杂度可能为10^8

for (int j=0;j<n;j++){
    for (int i=1;i<=x;i++){
        if (coins[j]<=i)
            dp[i]=(dp[i]+dp[i-coins[j]])%mod;
    }
}

for(int j=0;j根据问题和您的解决方案
n
可以是100,
x
可以是10^6。 您的解决方案有一个嵌套的for循环,它最终会使程序的复杂度为O(n*x),在最坏的情况下,复杂度可能为10^8

for (int j=0;j<n;j++){
    for (int i=1;i<=x;i++){
        if (coins[j]<=i)
            dp[i]=(dp[i]+dp[i-coins[j]])%mod;
    }
}

for(int j=0;j考虑这个测试用例

500 10
1 10 20 30 40 50 60 70 80 90 ... 4990
你认为有多少种方法可以从这些硬币中得到10枚?
只有2枚,我从来不用考虑使用超过10枚的硬币。
在这种奇怪的情况下,你需要走捷径。
瞄准良好的条件可以跳过很多。

如果像我的例子一样,你可以依靠硬币值的排序,你甚至可以得到明显更短的循环。试试看。如果它失败了,试着先对硬币值进行排序,这应该是值得的。

考虑一下这个测试案例

500 10
1 10 20 30 40 50 60 70 80 90 ... 4990
你认为有多少种方法可以从这些硬币中得到10枚?
只有2枚,我从来不用考虑使用超过10枚的硬币。
在这种奇怪的情况下,你需要走捷径。
瞄准良好的条件可以跳过很多。

如果像我的例子一样,你可以依赖于硬币值被排序,你甚至可以让循环明显变短。试试看。如果它失败了,试着先对硬币值进行排序,那应该是值得的。

谢谢大家的帮助!我终于找到了导致我的程序运行的原因。结果是数组中使用了long-long。我将它改为int类型,现在它被接受了。这是我的最终代码。我找到了一个解释

#include <iostream>
#include <algorithm>

using namespace std;

int dp[1000005], mod=1e9+7, coins[105];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, x;
    cin>>n>>x;
    for (int i=0;i<n;i++){
        cin>>coins[i];
    }
    dp[0]=1;
    for (int j=0;j<n;j++){
        for (int i=1;i<=x;i++){
            if (coins[j]<=i)
                dp[i]=(dp[i]+dp[i-coins[j]])%mod;
        }
    }
    cout<<dp[x]<<endl;
    return 0;
}
#包括
#包括
使用名称空间std;
int dp[1000005],mod=1e9+7,硬币[105];
int main(){
ios_base::与_stdio同步(false);
cin.tie(nullptr);
int n,x;
cin>>n>>x;
对于(整数i=0;i>硬币[i];
}
dp[0]=1;

for(int j=0;j感谢大家的帮助!我终于找到了导致我的程序失败的原因。原来是数组中使用了long long。我将它改为int类型,现在它被接受了。这是我的最终代码。我找到了一个解释,解释了为什么

#include <iostream>
#include <algorithm>

using namespace std;

int dp[1000005], mod=1e9+7, coins[105];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, x;
    cin>>n>>x;
    for (int i=0;i<n;i++){
        cin>>coins[i];
    }
    dp[0]=1;
    for (int j=0;j<n;j++){
        for (int i=1;i<=x;i++){
            if (coins[j]<=i)
                dp[i]=(dp[i]+dp[i-coins[j]])%mod;
        }
    }
    cout<<dp[x]<<endl;
    return 0;
}
#包括
#包括
使用名称空间std;
int dp[1000005],mod=1e9+7,硬币[105];
int main(){
ios_base::与_stdio同步(false);
cin.tie(nullptr);
int n,x;
cin>>n>>x;
对于(整数i=0;i>硬币[i];
}
dp[0]=1;


对于(int j=0;jDou知道硬币值是按顺序给出的吗?如果不按顺序排列硬币数组。那么循环If构造可以稍微取消。@Yunnosch我以前错过了算法部分,现在我找到了新答案。谢谢你知道硬币值是按顺序给出的吗?如果不按顺序排列硬币数组。那么循环if构造可以稍微取消设置。@Yunnosch我以前错过了算法部分,现在我找到了新的答案。Thanks@Yunnosch,我应该编辑答案而不是删除它,我的错误。你答案的第一部分指出了一些明显与TLE有关的内容,但我没有看到您在hwo上提供的解决方案。@Yunnosch如果在嵌套循环计算之前对硬币值进行排序,我想这将优化复杂性。您知道您实际上引用了我的评论和我的答案,不是吗?仅排序没有帮助。(这可能会有帮助,但你需要讨论原因,或者参考。)我以前已经解决了这类问题,这就是为什么给你的洞察力和你的评论也帮助我得出结论。但是,谢谢你,我会在回答下一个问题的时候考虑这些问题。@ Yunnosch,我应该编辑答案而不是删除它,我的错误。你的答案的第一部分指出了OBVI的一些东西。Yunnosch与TLE相关,但我看不到您在hwo上提供的解决方法。@Yunnosch如果在嵌套循环计算之前对硬币值进行排序,我想这将优化复杂性。您知道您实际上引用了我的评论和我的答案,不是吗?仅排序没有帮助。(这可能会有帮助,但你需要讨论原因,或者参考。)我以前已经解决了这类问题,这就是为什么给你的洞察力和你的评论也帮助我得出结论。但是,谢谢你,我会在回答下一个问题的时候考虑这些问题。在这里做排序很有趣,但是我认为那些测试用例并不像你的那样特别,也许还有其他的条件吗?可以使用吗?这是我的代码,它仍然是TLE。我不会忽略奇怪的测试用例。这些挑战强调考虑边缘用例,它们绝对肯定有大型测试用例。请记住,动态编程不仅仅是从“较小”的解决方案(类似于递归)组装解决方案,但也要避免不必要的测试。在这里进行排序很有趣,但我认为这些测试用例并不像您的那么特殊,可能还有其他条件可以使用吗?这是我的代码,它仍然是TLE。我不会忽略奇怪的测试用例。这些挑战强调考虑边缘用例,它们是绝对的请记住,动态编程不仅仅是从“较小”的解决方案(类似于递归)中组装解决方案,而且还可以避免不必要的错误