[낙곡] P1537 탄주(#검색)

제목 설명
마사와 빌은 각자 자신의 탄주 소장품을 가지고 있다.그들은 두 사람이 탄주를 평등하게 가질 수 있도록 소장품을 재분배하려고 한다.만약 모든 탄주의 가치가 같다면 그들은 동등하게 나눌 수 있을 것이다.불행히도 탄주가 더 크거나 아름다워서 마사와 빌은 탄주마다 1~6의 가치를 주었다.지금 그들은 이 탄주들을 똑같이 나누어 모든 사람이 얻는 총가치를 똑같이 하려고 한다.불행하게도, 그들은 그들이 이런 방식으로 탄주를 나누지 못할 수도 있다는 것을 발견했다.예를 들어 가치가 1, 가치가 3, 두 개의 가치가 4인 탄주가 있다면 그들은 탄주를 가치가 같은 두 부분으로 나눌 수 없다.그래서 그들은 모든 탄주를 가치와 같은 두 부분으로 나눌 수 있는지를 알려주는 프로그램을 쓰기를 원한다.
입력 출력 형식
입력 형식:
입력 파일에는 여러 개의 줄이 있는데, 줄에는 6개의 비음수 N1이 포함되어 있다....,N6, 그중 미는 수치 i의 탄주의 가치다.최대 탄주 총수는 20000에 이를 것이다.
입력 파일의 마지막 행은 0 0 0 0 0 0입니다.이 분야를 처리하지 마라.
출력 형식:
각 세트의 데이터에 대해 "Collection #k:"을 출력하고, k는 여러 번째 세트를 출력하며, 이어서 "Can be divided."또는 "Can't be divided."
각 조가 출력된 후 빈 줄을 하나 더 쳐라.
출력 샘플 가져오기
샘플 #1 입력
1 0 1 2 0 0 
1 0 0 0 1 1 
0 0 0 0 0 0 

샘플 내보내기 #1
Collection #1:
Can't be divided.

Collection #2:
Can be divided.

사고의 방향
정해는 가방일 텐데, 나는 쓸 줄 몰라.당신들의 동태 기획이 그렇게 어려운가요?
정해는 가방이기 때문에 라벨에 가방 dp가 붙습니다.
dfs:
폭력은 탄주 하나하나를 매거해서 두 개의 탄주 총가치의 절반을 모을 수 있는지 확인해 보자.(처음에 내가 쓴 폭력 6중 순환, 이후 줄곧 20점)
#include 
#include 
#include 
using namespace std;
int n,s,a[7],flag;
void dfs(int now,int v)//now       ,cnt                
{
	if(now==s)//                 
	{
		v++;//    +1 
		now=0;//   =0 
		if(v==2)//       2          
		{
			flag=1;//   
			return;
		}
	}
	register int i;
	for(i=6;i>=1;i--)//              
	{
		if(a[i] && now+i<=s)//       i                                 
		{
			a[i]--;
			dfs(now+i,v);
			if(flag)//      
			{
				return;
			}
			a[i]++;
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	register int i,j,k(1);
	while(cin>>a[1]>>a[2]>>a[3]>>a[4]>>a[5]>>a[6])
	{
		flag=0,s=0;
		for(i=1;i<=6;i++)
		{
			s+=a[i]*i;//    
		}
		if(s==0)
		{
			return 0;
		}
		cout<>=1;//      
		dfs(0,0);
		if(flag==1)
		{
			cout<

좋은 웹페이지 즐겨찾기