标签:des style color os io java strong ar for
2 10 1 20 1 3 10 1 20 2 30 1 -1
20 10 40 40
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int M = 1e6 * 2; //注意范围;
int vis[M];//标记数组,标记一个数是否可以由给出的数组合得到;
struct M
{
int a,b;
void read()
{
scanf("%d %d",&a,&b);
}
}m[100];
int main()
{
int n;
while(~scanf("%d",&n) && n > 0)
{
int sum = 0;
memset(vis,0,sizeof(vis));
for(int i = 0; i < n; i++)
{
m[i].read();
sum += m[i].a * m[i].b;
}
int ans = sum / 2;
int res = 0;
vis[0] = 1;
for(int i = 0; i < n; i++)
{
for(int j = 0; j <= m[i].b * m[i].a; j += m[i].a)
{
for(int k = 0; k <= res; k++)
{
if(k > ans) break;
if(vis[k])
{
vis[k + j] = 1; //如果存在这样的数,则标记
}
}
res += m[i].b * m[i].a; //累加当前可以组成的最大的数
}
}
for(int i = ans; i >= 0; i--)//倒着找,可以找出一组最接近的数
{
if(vis[i])
{
ans = i;
break;
}
}
printf("%d %d\n",sum - ans,ans);
}
return 0;
}
标签:des style color os io java strong ar for
原文地址:http://blog.csdn.net/zsgg_acm/article/details/38966485