标签:dp
2 10 1 20 1 3 10 1 20 2 30 1 -1
20 10 40 40
题意,软件学院与计算机学院分东西,尽可能的使两个学院分的一样多,结果计算机学院分得的要大于等于软件学院的价值.
即在一个空间容量为总价值的一半的情况下,如何能使这个空间装的价值最大,这个最大值必然是小于等于总价值的一半的,即为最终软件学院分得的价值.需要注意的是 t 的范围是大于等于0,而不是不等于-1
code:
<pre name="code" class="cpp">#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include<algorithm>
#include<string>
#include<queue>
#define max1(a,b) a>b?a:b
using namespace std;
int num[1008],w[1008];
int main()
{
int t;
while(~scanf("%d",&t),t>=0)
{
int v=0;
for(int i=0; i<t; i++)
{
scanf("%d%d",&w[i],&num[i]);
v+=w[i]*num[i];
}
int sum=v;
v=v/2.0+0.4;
int dp[200007]= {0};
for(int i=0; i<t; i++)
{
while(num[i]--)
{
for(int j=v; j>=w[i]; j--)
dp[j]=max1(dp[j],dp[j-w[i]]+w[i]);
}
}
//不必找最大值,由上文可知
// if(sum-dp[v]>dp[v])
printf("%d %d\n",sum-dp[v],dp[v]);
// else
// printf("%d %d\n",dp[v],sum-dp[v]);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 1171 Big Event in HDU (01背包)
标签:dp
原文地址:http://blog.csdn.net/stffer/article/details/47026833