HDU 1171 Big Event in HDU(01背包)

题意:给出每个物体的价值和物体的数量,如何分使得A,B所得价值最接近并且A的价值不能小于B

思路:DP算法,背包问题,,求法是先求出总价值sum,再用dp[]求sum/2最多能放多少价值!即可以求出其中一个数了,另一个就是sum-dp[sum/2]了。

;#define MAX 300000int dp[MAX],v[1000],m[1000];int main(){ int i,j,n,k; while(cin>>n&&n>=0) {int sum=0;for(i=0;i<n;i++){cin>>v[i]>>m[i];sum+=v[i]*m[i];}memset(dp,0,sizeof(dp));for(i=0;i<n;i++)for(j=1;j<=m[i];j++)for(k=sum/2;k>=v[i]*j;k–)if(dp[k]<dp[k-v[i]]+v[i])dp[k]=dp[k-v[i]]+v[i];cout<<sum-dp[sum/2]<<” “<<dp[sum/2]<<endl; } return 0;}

人生,一场人喧鼓响的戏,我只是一个平凡的过客,

HDU 1171 Big Event in HDU(01背包)

相关文章:

你感兴趣的文章:

标签云: