0-1背包,套用标准模板即可。
#include
#include
#include
using namespace std;
const int MAXN = 5000005;
int value[MAXN]; //物品价值
int dp[MAXN]; //背包内物品最大价值,dp[i]表示容量为i的背包的最大价值
int main()
{
int N;
int V, M; //价值,数量
while (cin >> N)
{
if (N < 0)
break;
int sum = 0; //总价值
int index = 0; //下标
for (int i = 0; i < N; i++)
{
cin >> V >> M;
sum += V * M;
while (M--) //将多个等价值物品拆成单个存储
value[index++] = V;
}
int maxV = sum / 2; //背包最大容量
memset(dp, 0, sizeof(dp));
for (int i = 0; i < index; i++) //0-1背包
{
for (int j = maxV; j >= value[i]; j--)
dp[j] = max(dp[j - value[i]] + value[i], dp[j]);
}
cout << sum - dp[maxV] << " " << dp[maxV] << endl;
}
return 0;
}
继续加油。