NYOJ 325 zb的生日+NYOJ 456 郵票分你一半

題目鏈接:

http://acm.nyist.net/JudgeOnline/problem.php?pid=325

http://acm.nyist.net/JudgeOnline/problem.php?pid=456

都可以用0,1揹包問題來做,不過 zb的生日貌似用搜索更快(沒試過。。。。。。),郵票分你一半貌似用搜索就會超時(也沒試過鄙視)。因爲看起來用0,1揹包更簡單,所以就用0,1揹包做了。我博客以前寫過0,1揹包的詳細解釋,這裏就不再貼了。

題目就是要你均分,如果不能均分就儘量使兩堆重量/票價差距最小。可以想象成有一堆物品,兩個容器(容量和除以2),只要保證把其中一個容器的容積儘量加滿(當然恰好能滿最好),這就轉化成了0,1揹包問題了。代碼就簡單了。兩段代碼幾乎一樣,所以給出郵票就行。

代碼:

#include<stdio.h>
#include<string.h>
int main()
{
	int ncases,n,i,j,sum,a[100001],b[100001];
	scanf("%d",&ncases);
	while(ncases--)
	{
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		sum=0;
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			sum=sum+a[i];
		}
		for(i=1;i<=n;i++)
		{
			for(j=sum/2;j>=a[i];j--)//**j代表容量,逆推**//
			{
				b[j]=(b[j]>b[j-a[i]]+a[i]?b[j]:b[j-a[i]]+a[i]);
			}
		}
		printf("%d\n",sum-2*b[sum/2]);
	}
	return 0;
}                





發佈了103 篇原創文章 · 獲贊 748 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章