HDU 1059 Dividing(多重背包)
2016-03-27 10:52
357 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1059
思路:简单多重背包,按照题目数据开的数组,结果RE了,果断开大,直接过了
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int a[10];
int dp[100100];
int sum;
void complete_pack(int value)
{
for(int i=value; i<=sum; i++)
dp[i] = max(dp[i],dp[i-value]+value);
}
void zeroone_pack(int value)
{
for(int i=sum; i>=value; i--)
dp[i] = max(dp[i],dp[i-value]+value);
}
void multi_pack()
{
for(int i=1; i<=6; i++)
{
if(a[i] * i >= sum)
complete_pack(i);
else
{
int k = 1;
int count1 = a[i];
while(k < count1)
{
zeroone_pack(k*i);
count1 -= k;
k *= 2;
}
zeroone_pack(count1*i);
}
}
}
int main()
{
int cas = 1;
while(true)
{
sum = 0;
memset(dp,0,sizeof(dp));
for(int i=1; i<=6; i++)
{
scanf("%d",&a[i]);
sum += (a[i] * i);
}
if(sum == 0)
break;
printf("Collection #%d:\n",cas++);
if(sum & 1)
{
printf("Can't be divided.\n\n");
continue;
}
sum /= 2;
multi_pack();
if(dp[sum] == sum)
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}
思路:简单多重背包,按照题目数据开的数组,结果RE了,果断开大,直接过了
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
const int inf = 0x3f3f3f3f;//1061109567
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int a[10];
int dp[100100];
int sum;
void complete_pack(int value)
{
for(int i=value; i<=sum; i++)
dp[i] = max(dp[i],dp[i-value]+value);
}
void zeroone_pack(int value)
{
for(int i=sum; i>=value; i--)
dp[i] = max(dp[i],dp[i-value]+value);
}
void multi_pack()
{
for(int i=1; i<=6; i++)
{
if(a[i] * i >= sum)
complete_pack(i);
else
{
int k = 1;
int count1 = a[i];
while(k < count1)
{
zeroone_pack(k*i);
count1 -= k;
k *= 2;
}
zeroone_pack(count1*i);
}
}
}
int main()
{
int cas = 1;
while(true)
{
sum = 0;
memset(dp,0,sizeof(dp));
for(int i=1; i<=6; i++)
{
scanf("%d",&a[i]);
sum += (a[i] * i);
}
if(sum == 0)
break;
printf("Collection #%d:\n",cas++);
if(sum & 1)
{
printf("Can't be divided.\n\n");
continue;
}
sum /= 2;
multi_pack();
if(dp[sum] == sum)
printf("Can be divided.\n\n");
else
printf("Can't be divided.\n\n");
}
return 0;
}
相关文章推荐
- 万年历查询地址 当天日期(带周)
- Android.mk内容介绍
- .Net AOP(二)远程代理Remoting/RealProxy
- 【USACO 5.5.1】Picture
- Android中序列化的实现?使用Serializable还是Parcelable
- 在c代码中使用logcat
- C++ 利于宏模拟C#的正则表达式
- BZOJ 1997 HNOI 2010 Planar 2-SAT
- Linux系统启动过程
- Android开发:按一定频率同时获取多个传感器数据
- MyEclipse------如何在特定目录下创建文件夹
- 敏捷开发方法综述
- 一周乱弹(3.27 )1,copyProperties 比较2, java Object... objects 可变参数
- Tuhdo emacs 学习笔记
- Windows XP下安装WinCE6.0开发环境
- idea unknow facet type web 解决方案
- 个人学习php的心得
- 一次nginx 502 & mysql not contect 排错经历
- vs2013配置OpenGL
- Coursera台大机器学习基础课程学习笔记1 -- 机器学习定义及PLA算法