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

_Zoran _Zoran 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
如今,我们都知道计算机学院是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];


}

}
...全文
评论 3
收藏 已收藏
分享
返回顶部
_Zoran
C语言 70,039 成员 243,237 内容