zoukankan      html  css  js  c++  java
  • HDU 1171 Big Event in HDU【01背包】

    题意:给出n个物品的价值和数目,将这一堆物品分给A,B,问怎样分使得两者的价值最接近,且A的要多于B

    第一次做的时候,没有思路---@_@

    因为需要A,B两者最后的价值尽可能接近,那么就可以将背包的容量转化为sum/2来做,然后按照01背包的做法来做

    #include<iostream>  
    #include<cstdio>  
    #include<cstring>  
    #include<algorithm> 
    #define maxn 500005 
    using namespace std;
    int dp[maxn],v[maxn],w[maxn];
    int main()
    {
    	int i,j,k,n;
    	while(scanf("%d",&n)!=EOF&&n>0)
    	{
    		int sum=0;
    		memset(dp,0,sizeof(dp));
    		for(i=1;i<=n;i++)
    		{
    			scanf("%d %d",&v[i],&w[i]);
    			sum+=v[i]*w[i];
    		}
    		
    		for(i=1;i<=n;i++)
    			for(j=1;j<=w[i];j++)
    				for(k=sum/2;k>=v[i];k--)
    					dp[k]=max(dp[k],dp[k-v[i]]+v[i]);
    		printf("%d %d
    ",sum-dp[sum/2],dp[sum/2]);		
    	}
    }
    

      

  • 相关阅读:
    Java语言
    Java面向对象编程思想
    final关键字
    abstract关键字
    对象初始化过程
    访问修饰符
    继承
    面向对象设计
    static
    封装
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4287279.html
Copyright © 2011-2022 走看看