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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值