hdu 1059 Dividing

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1059

多重背包。。


不加a[i]=a[i]%10;会超时。。当a[i]大于10,造成的效果和10以下一样。

下面是AC代码:

#include<iostream>
using namespace std;
int f[200009];
int main()
{
	int a[7];
	int sum;
	int i,j,k;
	int ca=1;
	while(1)
	{
		sum=0;
		for(i=1;i<=6;i++)
		{
			cin>>a[i];
			a[i]=a[i]%10;               
			sum+=a[i]*i;
		}
		if(sum==0)
			break;
		
		printf("Collection #%d:\n",ca++);
		
		if(sum%2!=0)
			printf("Can't be divided.\n\n");
		else
		{
			memset(f,0,sizeof(f));
			f[0]=1;
			sum=sum/2;
			
			for(i=1;i<=6;i++)
			{
				for(j=sum;j>=1;j--)
				{
					if(f[sum])
						break;
					for(k=1;k<=a[i];k++)
					{
						if(f[sum])
							break;	
						if(f[j-k*i]&&j>=k*i)
							f[j]=1;
					}
				}
				
				
			}
			if(f[sum])
				printf("Can be divided.\n\n");
			else
				printf("Can't be divided.\n\n");
			
			
		}
	}
	return 0;
}


你可能感兴趣的:(hdu 1059 Dividing)