大佬们帮我看下这题,结果正确,但却Runtime Error(ACCESS_VIOLATION)
如今,我们都知道计算机学院是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];
}
}