题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=325
http://acm.nyist.net/JudgeOnline/problem.php?pid=456
分析:动态规划,算是01背包的变形,题目就是要你均分,如果不能均分就尽量使两堆重量/票价差距最小。可以想象成有一堆物品,两个容器(容量和除以2),只要保证把其中一个容器的容积尽量加满(当然恰好能满最好),这就转化成了0,1背包问题了,出题人考的是搜索,但我搜索基本没写过,弱菜一枚。。。
两题代码基本一样:
作为参考:
/************ 邮票分你一半 Times:148ms ************/ #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<stack> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> using namespace std; #define max(a,b) a>b?a:b #define min(a,b) a>b?b:a #define mem(a,b) memset(a,b,sizeof(a)) int dir[4][2]= {{0,1},{0,-1},{1,0},{-1,0}}; int ch[1501],d[110000]; int main() { int N,n,m,i,j; int sum,t; scanf("%d",&n); while(n--) { scanf("%d",&N); sum=0; mem(ch,0); mem(d,0); for(i=1; i<=N; i++) { scanf("%d",ch+i); sum+=ch[i]; //printf("%d ",sum); } t=(sum/2); 分成两个容量 for(i=1; i<=N; i++) for(j=t; j>=ch[i]; j--)j代表容量,逆推 d[j]=max(d[j],d[j-ch[i]]+ch[i]); printf("%d\n",abs(sum-2*d[t])); } return 0; }