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]);		
    	}
    }
    

      

  • 相关阅读:
    Emacs 使用YASnippet
    odbc备忘
    Emacs 矩形编辑
    ftp by libcurl
    emacsshell
    Emacs cnblogs 代码着色
    Emacs下的Man
    #include ""还是<>
    三种*
    应对Maze勒索攻击的最佳实践分享
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4287279.html
Copyright © 2011-2022 走看看