ZOJ1149 POJ1014 HDU1059 Dividing, 다중 가방 문제

1665 단어 email
고전적인 다중 배낭 문제입니다. 배낭 9강 중의 3강을 보실 수 있습니다.
/*******************************************************************************
 # Author : Neo Fung
 # Email : [email protected]
 # Last modified: 2011-10-02 20:46
 # Filename: ZOJ1149 POJ1014 HDU1059 Dividing.cpp
 # Description : 
 ******************************************************************************/
// #include "stdafx.h"
// #define DEBUG

#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <memory.h>

using namespace std;
int dp[450000],value[200000];

int main(void)
{
#ifdef DEBUG  
	freopen("data.txt","r",stdin);  
#endif  
	int ind=1;
	int num[7];
	while(scanf("%d %d %d %d %d %d",&num[1],&num[2],&num[3],&num[4],&num[5],&num[6])!=EOF)
	{
		int total=0;
		for(int i=1;i<=6;++i)
			total+=i*num[i];
		if(total==0) break;
		printf("Collection #%d:
",ind++); if(total%2) { printf("Can't be divided.

"); continue; } int half=total/2; int ncount=0; memset(dp,0,sizeof(dp)); for(int i=1;i<=6;++i) // { int temp=num[i]; if(temp==0) continue; int pow2=1; while(temp>pow2) { value[ncount++]=pow2*i; temp-=pow2; pow2*=2; } if(temp) value[ncount++]=temp*i; } for(int i=0;i<ncount;++i) // 0/1 for(int j=half;j>=value[i];--j) dp[j]=max(dp[j],dp[j-value[i]]+value[i]); if(dp[half]==half) printf("Can be divided.

"); else printf("Can't be divided.

"); } return 0; }

좋은 웹페이지 즐겨찾기