您的位置:首页 > 其它

hdu 1171

2015-06-12 00:41 381 查看
A test case starting with a negative integer terminates input and this test case is not to be processed.

负整数终止输入 while(scanf("%d",&n),n>=0)

题意:n行数据,每行一个v,m;表示m个v,求分成两个差值最小的两组

思路:先输入一组数据,初始化v,m,总价值sum;然后没输入一组数据就更新一次c1,c2,sum;从总价值的一半开始找,总价值为偶时,for循环第一次判断总价值的一半,若不为零,跳出,输出(为什么?)

<pre name="code" class="cpp">#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int c1[250000],c2[250000];

int main()
{
int n;
int v,m;
int i,j,k;
int sum;

while(scanf("%d",&n),n>=0)
{
scanf("%d%d",&v,&m);//cin>>v>>m;
sum = v*m;
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));

for(i = 0; i <= sum; i++)
c1[v*i] = 1;

for(i = 2; i <= n; i++)
{
scanf("%d%d",&v,&m);//cin>>v>>m;

for(j = 0; j <= sum; j++)
for(k = 0;k <= v*m; k+=v)
{
c2[k+j] += c1[j];
}
sum = sum + v*m;
for(j = 0; j <= sum ;j++)
{
c1[j] = c2[j];
c2[j] = 0;
}
}
for(i = sum/2; i > 0; i--)
{
if(c1[i] != 0)
break;
}
printf("%d %d\n",sum-i,i);//cout<<sum2-i<<" "<<i<<endl;
}
return 0;
}



可以试试dp
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: