题意:简单的来说就是让你来分多种东西,问怎么分才能使得所分的A,B所代表的两个价值量的总和尽可能的相等,其中题目还要求让A>=B。
思路:这个题目可以通过01背包分组来解决,也可以通过多重背包来解决
代码:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int k=1000000;
int dp[k];
int v;
int c[k],w[k];
void zeroonepack(int cost,int wei)
{
int i;
for(i=v;i>=cost;i--)
{
dp[i]=max(dp[i],dp[i-cost]+wei);
}
}
void complete(int cost,int wei)
{
int i;
for(i=cost;i<=v;i++)
{
dp[i]=max(dp[i],dp[i-cost]+wei);
}
}
void mutiplepack(int cost,int wei,int cnt)
{
if(cost*cnt>=v)
{
complete(cost,wei);
return;
}
else
{
int p=1;
while(p<cnt)
{
zeroonepack(p*cost,p*wei);
cnt=cnt-p;
p=2*p;
}
zeroonepack(cnt*cost,cnt*wei);
}
}
int main()
{
int n,i,sum;
while(scanf("%d",n),n>0)
{
v=0;
for(i=0;i<n;i++)
{
scanf("%d%d",c[i],w[i]);
v+=c[i]*w[i];
}
}
sum=v;
v=(v/2);
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
{
mutiplepack(c[i],w[i],c[i]);
}
printf("%d%d/n",sum-dp[v],dp[v]);
}
感想:用多重背包求解时,超时了,等我把cin换成scanf再贴上代码。。