链接:点击打开链接
题意:给出每个物品的价值和数量,如何分配使得A,B所得价值最接近并且A的价值不能小于B
代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int v[10005],w[10005],dp[500005];
int main(){
int n,i,j,k,num,tmp,sum;
while(scanf("%d",&n)!=EOF&&n>0){
sum=0;
for(i=0;i<n;i++){
scanf("%d%d",&v[i],&w[i]);
sum+=v[i]*w[i];
} //总数是sum,如果其中一个是A,则另一个
memset(dp,0,sizeof(dp)); //是sum-A,则两者的差为sum-2*A,如果使
for(i=0;i<n;i++){ //最小则变为一个背包容量为sum的背包,每
num=w[i]; //个物品体积变为2倍,最多装多少
for(k=1;num>0;k<<=1){
tmp=min(k,num);
for(j=sum;j>=2*v[i]*tmp;j--)
dp[j]=max(dp[j],dp[j-2*tmp*v[i]]+2*tmp*v[i]);
num-=tmp;
}
}
printf("%d %d\n",sum-dp[sum]/2,dp[sum]/2);
}
return 0;
}