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循环第一次判断总价值的一半,若不为零,跳出,输出(为什么?)
可以试试dp
负整数终止输入 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
相关文章推荐
- Difference between INNER and OUTER joins?
- 我的自白,白衣轩重开
- 线程优先级问题
- Arduino 入门程序示例之一片 LED(2015-06-11)
- To_10_r_100_5---查找最小的K个元素
- Oracle数据库之PL/SQL程序设计基础
- What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?
- POJ 1005
- 新的个人博客开通!!!
- 分享知识,传播理念-视频学院挺好
- js弹出放大图
- __init__和__new__,以及self
- Effective Java 1:考虑使用静态工厂方法代替构造器
- 编程之美----2.21 只考加法的面试题
- sgu264:Travel(稳定婚姻问题)
- java第四次实验报告
- 课本最后一章及博客读后感
- Java GC的原理
- MySQL INNER JOIN
- 实验五 网络编程及安全