您的位置:首页 > 其它

练习三 1019

2016-05-28 15:37 267 查看
概述:题目是真的没有怎么看懂,但是可以看出这是一道基础多重背包问题。

思路:由于当时还没有怎么了解多重背包,所以直接将其转化为了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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: