题意:
输入一系列器械的价值及分别的个数,将它们尽可能地均分。
思路:
先计算出所有器械价值的总和,除以2得到一个max,那么少的那部分的价值肯定在0-max当中
开始动态规划。
价值为0是肯定可以做到的,标记为1(可取到)。
此后对每件器械,在前面的基础上可以取到的价值进行标记。
最后从max开始往下找,找到的第一个可以的就是少的那部分的价值。
AC代码如下:
//1171.cpp
#include <cstdio>
#include <cstring>
#define maxn 60
#define maxx 300000
int v[maxn],m[maxn];
bool a[maxx];
int main()
{
int n,sum,i,max,j,k;
while (scanf("%d",&n)!=EOF && n>0)
{
sum = 0;
for (i=0;i<n;++i)
{
scanf("%d %d",&v[i],&m[i]);
sum += v[i]*m[i];
}
max = sum/2;
memset(a,0,sizeof(a));
a[0] = true;
for (i=0;i<n;++i)
for (j=max;j>=0;--j)
for (k=1;k<=m[i];++k)
if (j-v[i]*k>=0 && a[j-v[i]*k])
{
a[j] = true;
break;
}
i = max;
while (!a[i])
--i;
printf("%d %d\n",sum-i,i);
}
return 0;
}
开心!又是一道今天一遍AC的题目w

2万+

被折叠的 条评论
为什么被折叠?



