概述:题目是真的没有怎么看懂,但是可以看出这是一道基础多重背包问题。
思路:由于当时还没有怎么了解多重背包,所以直接将其转化为了01背包来做,并且二进制分解都没用,所幸数据较小,没有超时。
感想:当时只自学了01背包,,,一切以01来做。
<span style="font-size:14px;">#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[255555];
int va[500],nu[500],v[5005],w[2000];
int main()
{
int N;
while(cin>>N&&N>0)
{
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
memset(va,0,sizeof(va));
int num=0;
int k=0;
for(int i=0;i<N;i++)
{
cin>>va[i]>>nu[i];
v[k]=va[i];
k++;
num+=va[i]*nu[i];
if(nu[i]!=1)
{
for(int j=1;j<nu[i];j++)
{
v[k]=va[i];
k++;
}
}
}
for(int i=0;i<k;i++)
{
for(int j=num/2;j>=v[i];j--)
{
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
}
}
cout<<num-dp[num/2]<<' '<<dp[num/2]<<endl;
}
return 0;
}</span>