博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDOJ HDU 1171 Big Event ACM 1171 IN HDU
阅读量:5266 次
发布时间:2019-06-14

本文共 1902 字,大约阅读时间需要 6 分钟。

//MiYu原创, 转帖请注明 : 转载自 
题目地址:
多重背包的题目,  可以直接转换成 0-1背包来做,  因为是要分成尽量相等的2部分, 所以 背包大小 sum / 2 就可以了.
另外, 还有一点要注意 ,  结束条件是 非负数, 而不是 -1 !! 我在这里 TLE了一下午............YM
代码如下 :
//MiYu原创, 转帖请注明 : 转载自 
#include 
<
iostream
>
using
 
namespace
 std;
int
 V[
51
];
int
 M[
51
];
int
 bst[
125005
];
int
 main ()
{
    
int
 N;
    
while
 ( scanf ( 
"
%d
"
,
&
N ), N 
>
 
0
 )
    {
           
int
 sum 
=
 
0
;
           
for
 ( 
int
 i 
=
 
1
; i 
<=
 N; 
++
 i )
           {
                 scanf ( 
"
%d%d
"
,
&
V[i], 
&
M[i] ); 
                 sum 
+=
 V[i] 
*
 M[i];
           } 
           
int
 total 
=
 sum;
           sum 
/=
 
2
;
           memset ( bst, 
0
 , 
sizeof
 ( bst ) );
           
for
 ( 
int
 i 
=
 
1
; i 
<=
 N; 
++
 i )
           {
                 
for
 ( 
int
 j 
=
 
1
; j 
<=
 M[i]; 
++
 j )
                 {
                       
for
 ( 
int
 k 
=
 sum; k 
>=
 V[i] ; k 
-=
 V[i] )
                       {
                             
if
 ( bst[ k 
-
 V[i] ] 
+
 V[i] 
>
 bst[k] )
                             {
                                  bst[k] 
=
 bst[ k 
-
 V[i] ] 
+
 V[i] ;
                             }
                       } 
                 } 
           }
           
int
 other 
=
 total 
-
 bst[sum];
           
if
 ( other 
>
 bst[sum] )
           {
                swap ( other, bst[sum] ); 
           }
           printf ( 
"
%d %d\n
"
, bst[sum], other );
    }
    
return
 
0
  下面的是奋斗哥的代码 ,:
//
 Author: Tanky Woo
//
 HDOJ 1171
 
 
#include 
<
iostream
>
using
 
namespace
 std;
 
int
 c1[
250010
], c2[
250010
];
int
 value[
55
];
int
 amount[
55
];
int
 main()
{
    
int
 nNum;
    
while
(scanf(
"
%d
"
&
nNum) 
&&
 nNum
>
0
)
    {
        memset(value, 
0
sizeof
(value));
        memset(amount, 
0
sizeof
(amount));
 
        
int
 sum 
=
 
0
;
        
for
(
int
 i
=
1
; i
<=
nNum; 
++
i)
        {
            scanf(
"
%d %d
"
&
value[i], 
&
amount[i]);
            sum 
+=
 value[i]
*
amount[i];
        }
        memset(c1, 
0
, sum
*
sizeof
(c1[
0
]));
        memset(c2, 
0
, sum
*
sizeof
(c2[
0
]));
        
for
(
int
 i
=
0
; i
<=
value[
1
]
*
amount[
1
]; i
+=
value[
1
])
            c1[i] 
=
 
1
;
        
int
 len 
=
 value[
1
]
*
amount[
1
];
        
for
(
int
 i
=
2
; i
<=
nNum; 
++
i)
        {
            
for
(
int
 j
=
0
; j
<=
len; 
++
j)
                
for
(
int
 k
=
0
; k
<=
value[i]
*
amount[i]; k
+=
value[i])
                {
                    c2[k
+
j] 
+=
 c1[j];
                }
            len 
+=
 value[i]
*
amount[i];
            
for
(
int
 j
=
0
; j
<=
len; 
++
j)
            {
                c1[j] 
=
 c2[j];
                c2[j] 
=
 
0
;
            }
        }
        
for
(
int
 i
=
 sum
/
2
; i
>=
0
--
i)
            
if
(c1[i] 
!=
 
0
)
            {
                printf(
"
%d %d\n
"
, sum
-
i, i);
                
break
;
            }
    }
    
return
 
0
;
}

转载于:https://www.cnblogs.com/MiYu/archive/2010/08/18/1802417.html

你可能感兴趣的文章
Js时间处理
查看>>
Java项目xml相关配置
查看>>
三维变换概述
查看>>
vue route 跳转
查看>>
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>