多重背包 :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;
}