HDU 1171 Big Event in HDU

来源:互联网 发布:手机制作动漫软件 编辑:程序博客网 时间:2024/06/16 18:00

【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=1171

题目意思

题目大意:给你n种价值的东西,每种东西都有m个,问你把这m*n个东西分成两部分,问你怎么分两部分最接近。

解题思路

直接求空间n*m/2的背包最大值就可以了,由于时间给的很多,数值也不大就直接用01背包跑就可以了。

代码部分

#include <bits/stdc++.h>using namespace std;#define LL long longconst int maxn=105;const int INF=0x3f3f3f;int v[maxn];int m[maxn];int dp[250005]; ///背包最优存储int main(){    int n;    while(scanf("%d",&n))    {        if (n<0)            break;        memset(dp,0,sizeof(dp));        int temp=0;        for (int i=0;i<n;i++)        {            int v1,m1;            scanf("%d %d",&v[i],&m[i]);            temp+=v[i]*m[i];   ///求总价值        }        for (int i=0;i<n;i++)   ///n个种类        {            for (int j=temp/2;j>=v[i];j--)   ///背包从大到小跟新            {                if (dp[j]<dp[j-v[i]]+v[i])                {                    dp[j]=dp[j-v[i]]+v[i];                    //cout<<j<<' '<<dp[j]<<endl;                }                m[i]--;                    if (m[i]>0)   ///如果多个在让他跑次这个种类                    i--;            }        }        printf("%d %d\n",temp-dp[temp/2],dp[temp/2]);    }}
原创粉丝点击