hdu 1171Big Event in HDU
这题假设所有的价值加起来为sum
那么我们假设一个sum/2的背包
用这个背包装物品,于是,这就转化成了一个多重背包问题
= =我只会用二进制分解算多重背包
以下是代码
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<algorithm> using namespace std; int n; int val[5000]; int size; int d[300000]; int main() { int N; while(scanf("%d",&N),N>=0) { n=0; int value,num; int k; int sum=0; while(N--) { scanf("%d %d",&value,&num); sum+=value*num; //将num二进制分解 for(k=1;num-(int)pow(2.0,k*1.0)+1>0;k++) { val[n++]=value*(int)pow(2.0,(k-1)*1.0); } k--; val[n++]=(num-(int)pow(2.0,k*1.0)+1)*value; } //简单的01背包了 size=sum/2; int i,j; if(sum&1) { size++; } for(i=0;i<=size;i++) { d[i]=0; } for(i=1;i<=n;i++)//对于前i个物品 { for(j=size;j>=0;j--) { if(j-val[i-1]<0) { continue; } d[j]=d[j]>(d[j-val[i-1]]+val[i-1])?d[j]:(d[j-val[i-1]]+val[i-1]); } } int temp1,temp2; temp1=d[size]; temp2=sum-temp1; if(temp1<temp2) { int t=temp2; temp2=temp1; temp1=t; } printf("%d %d\n",temp1,temp2); } return 0; }