大佬们帮我看下这题,结果正确,但却Runtime Error(ACCESS_VIOLATION)

Zoran_卓 2019-01-21 12:30:37
如今,我们都知道计算机学院是HDU最大的系。但是,也许你不知道计算机学院在2002年曾被划分为计算机学院和软件学院。 分裂在HDU绝对是一件大事!同时,这也是一件麻烦事。所有设施必须分成两半。首先,对所有设施进行评估,如果两个设施具有相同的价值,则认为它们是相同的。假设有n(0<n<1000)种设施(不同价值、不同种类)。

输入包含多个测试用例。每个测试用例从一个数字n开始(0<n<=50——不同设施的总数)。接下来的n行包含一个整数v(0<v<=50——设施值)和一个整数m(0<m<=100——设施的相应数量)。你可以假设所有的v都是不同的。 以负整数开始的测试用例终止输入,不处理此测试用例。

对于每种情况,打印一行包含两个整数A和B,分别表示计算机学院和软件学院的值。A和B应尽可能相等。同时,你要保证A不小于B。

代码:
#include <iostream>
using namespace std;
int dp[26000];

int main()
{
int n, a, b,mo[2000],add=0, sum = 0;

while (cin >> n && n > 0)
{
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++)
{
cin >> a >> b;
for (int j = add+1; j <= add+b; j++)
mo[j] = a;
add = add + b;

}
for (int i = 1; i <= add; i++)
{
sum = mo[i] +sum;
}
for (int i = 1; i <= add; i++)
for (int j = 1; j<=sum/2; j++)
if(j>=mo[i])
dp[j] = dp[j] > (dp[j - mo[i]] + mo[i] )? dp[j] : (dp[j - mo[i]] + mo[i]);
else dp[j] = dp[j];

if (dp[sum / 2] >= (sum - dp[sum / 2])) cout << dp[sum / 2] << " " << (sum - dp[sum / 2]);
else cout << (sum - dp[sum / 2]) << " "<<dp[sum / 2];


}

}
...全文
122 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
棉猴 2019-01-21
  • 打赏
  • 举报
回复
VS2015运行没有错误
自信男孩 2019-01-21
  • 打赏
  • 举报
回复
memset(dp, 0, sizeof(dp));
这行可以去掉的,因为全局变量数组编译器会给初始化为0.因此这句是重复做一件事情。

if(j>=mo[i])
dp[j] = dp[j] > (dp[j - mo[i]] + mo[i] )? dp[j] : (dp[j - mo[i]] + mo[i]);
else if(j>=mo[i])
dp[j] = dp[j] > (dp[j - mo[i]] + mo[i] )? dp[j] : (dp[j - mo[i]] + mo[i]);
else dp[j] = dp[j];

这里的else内容是不是也是无用的。或者不是你的想法所在。建议改一下。
dp[j] = dp[j];
_ZGq 2019-01-21
  • 打赏
  • 举报
回复
本来就没有错误。
但是在评测系统会检测main函数的返回值是否为0,不为0的话系统会以为程序出了问题,于是报RE。
可以在最后加一行 return 0; 。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧