hdu 1171 bit 1014

多重背包  :01+二进制优化。

一开始 MultyPack函数for循环内因为没加 j = 0,结果一直Wa,最后多谢果神帮助。 

#include <stdio.h>
#include <math.h>
#include <string.h> 
int V_all[350000]; 		//dp的结果 
int V;			   		//背包的体积 

//将一个体积为cost,价值为value的物品放入背包。 
void ZeroOne(int value,int cost){
	for(int j = (int)(V/2);j>=cost;--j){
		if(V_all[j] < V_all[j - cost] + value && (V_all[j - cost] + value <=V/2)){
			V_all[j] = V_all[j-cost] + value;
		}
	}
	return ;	
}

//多重背包。 
void MultyPack(int *num,int *value,int kind){
	int temp,cost;
	for(int i = 0,j = 0; i < kind;++i){
		j = 0;
		temp = int(pow(2,j));
		
		for(;temp < num[i];++j){	
			ZeroOne((int)(pow(2,j)*value[i]),int(pow(2,j))*value[i]);
			temp += int(pow(2,j+1));
		}
		temp -= int(pow(2,j));
		cost = (num[i] - temp)*value[i];
		ZeroOne(cost,cost);
	}
	return ;
}

int main(int argc, char *argv[])
{
	//FILE *fp;	
	//fp = freopen("in3.txt","r",stdin);
	int kind;
	int value[60],num[60],top;
	while(scanf("%d",&kind),kind >=0){
		top = 0;
		V= 0;
		
		while(kind --){
			scanf("%d%d",&value[top],&num[top]);
			V += value[top]*num[top];
			++top;
		}
		memset(V_all,0,sizeof(V_all));
		MultyPack(num,value,top);
		printf("%d %d\n",V - V_all[V/2],V_all[V/2]);
		
	}
	return 0;
}



你可能感兴趣的:(hdu 1171 bit 1014)