/
第一个多重背包题目 真的不理解二进制优化
/http://acm.hdu.edu.cn/webcontest/contest_showproblem.php?cid=10594&pid=1001&ojid
以下是用二进制优化的 不会超时
include
include
include
include
using namespace std;
int dp[200000],a[7];
void zeroOne(int weiht,int value,int c)
{
for(int j=c;j>=weiht;j--)
dp[j]=max(dp[j],dp[j-weiht]+value);
}
void complelet(int weight,int value,int c)
{
for(int j=weight;j<=c;j++)
dp[j]=max(dp[j],dp[j-weight]+value);
}
void duoChong(int weight,int value,int count,int c)
{
if(countvalue>=c)complelet(weight ,value,c);
else
{
int k=1;
while(k<count)
{
zeroOne(kweight,kvalue,c);
count-=k;
k+=k;
}
zeroOne(countweight,countvalue,c);
}
}
int main()
{
int count=0;
while(1)
{
int sum=0;
for(int i=1; i<=6; i++)
{
scanf("%d",&a[i]);
sum+=a[i]i;
}
if(sum==0)break;
printf("Collection #%d:\n",++count);
if(sum%2==1)
{
printf("Can't be divided.\n\n");
continue;
}
int c=sum/2;
memset(dp,0,sizeof(dp));
for(int i=1; i<=6; i++)
duoChong(i,i,a[i],c);
if(dp[c]==sum/2)printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}
直接化为01背包计算 超时
include
include
include
include
using namespace std;
int dp[200000],a[7],w[7];
int main()
{
int count=0;
while(1)
{
int sum=0;
for(int i=1; i<=6; i++)
{
scanf("%d",&a[i]);
sum+=a[i]*i;
w[i]=i;
}
if(sum==0)break;
printf("Collection #%d:\n",++count);
if(sum%2==1)
{
printf("Can't be divided.\n\n");
continue;
}
int c=sum/2;
memset(dp,0,sizeof(dp));
for(int i=1; i<=6; i++)
for(int k=1; k<=a[i]; k++)//有限个数量(超时)
for(int j=c; j>=w[i]; j--)
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
printf("sum/2=%d\n",dp[sum/2]);
if(dp[c]==sum/2)printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}
下面是搜索做的 比多重背包快了很多
include
include
include
include
using namespace std;
int op=0;
int mid;
int a[8];
void dfs(int cnt,int sum)
{
if(op)return;
if(sum==mid)
{
op=1;
return ;
}
for(int i=cnt; i>=1; i--)
{
if(a[i])
if(sum+i<=mid)
{
a[i]--;
dfs(i,sum+i);
}
}
}
int main()
{
int count=0;
while(1)
{
int sum=0;
for(int i=1; i<=6; i++)
{
scanf("%d",&a[i]);
sum+=i*a[i];
}
if(sum==0)break;
printf("Collection #%d:\n",++count);
if(sum%2==1)
{
printf("Can't be divided.\n\n");
continue;
}
mid=sum/2;
op=0;
dfs(6,0);
if(op)printf("Can be divided.\n\n");
else printf("Can't be divided.\n\n");
}
return 0;
}
Dividing (多重背包 搜索)的更多相关文章
-
hdu 1059 Dividing(多重背包优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
-
Hdu 1059 Dividing &; Zoj 1149 &; poj 1014 Dividing(多重背包)
多重背包模板- #include <stdio.h> #include <string.h> int a[7]; int f[100005]; int v, k; void Z ...
-
hdu 1059 Dividing 多重背包
点击打开链接链接 Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
-
Dividing 多重背包 倍增DP
Dividing 给出n个物品的价值和数量,问是否能够平分.
-
POJ 1014 Dividing 多重背包
Dividing Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 63980 Accepted: 16591 Descri ...
-
POJ 1014 Dividing(多重背包, 倍增优化)
Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...
-
POJ 1014 / HDU 1059 Dividing 多重背包+二进制分解
Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...
-
hdu1059 Dividing ——多重背包
link:http://acm.hdu.edu.cn/showproblem.php?pid=1059 最简单的那种 #include <iostream> #include <cs ...
-
R - Dividing 多重背包
来源poj1059 Marsha and Bill own a collection of marbles. They want to split the collection among thems ...
随机推荐
-
crontab安装和用法(定时任务)
crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行.通常 ...
-
Windows 安装启动apache时出现错误的解决方法
配置安装Apache主服务发生错误:(OS 5)拒绝访问. : AH00369: Failed to open the Windows service manager, perhaps you fo ...
-
PDF编辑、删除、替换某页面或文字
在工作中,我们常常会用到PDF,当然尤其是会计,我虽然是程序员,但是“小老鼠”是会计,前几天,突然问我,怎么样将PDF中的某个页面替换掉,也就是删掉某页然后再从另外一个地方找一页补上来: 还需要改变这 ...
-
.net中String是引用类型还是值类型 以及 C#深层拷贝浅层拷贝
http://www.cnblogs.com/yank/archive/2011/10/24/2204145.html http://www.cnblogs.com/zwq194/archive/20 ...
-
c++入门之函数指针和函数对象
函数指针可以方便我们调用函数,但采用函数对象,更能体现c++面向对象的程序特性.函数对象的本质:()运算符的重载.我们通过一段代码来感受函数指针和函数对象的使用: int AddFunc(int a, ...
-
Linux文件管理命令 cat
1.cat 命令:将文件内容连接后传送到标准输出或重定向到文件. 1)命令语法格式:cat [OPTION] [FILE]... 2)命令选项参数说明如下所示. -n(number):从第一行开始对文 ...
-
solr7.7.0搜索引擎使用(三)(添加文件索引)
众所周知,solr与es的最大区别是,solr可以对pdf,txt,doc等文件生成索引 那我们如何添加文件索引呢? 步骤1.添加core,取名暂且为 coreFile 在bin下执行命令 ./sol ...
-
go语言学习-基础知识
go程序的基本结构 一个可以最简单的可运行的go程序需要满足下面两个条件: 有一个main()函数 main()函数在main包中 例如: 在go语言中的 hello world 程序如下: // m ...
-
Guarding Bananas
Guarding Bananas Once there was a lazy monkey in a forest. But he loved banana too much. One day the ...
-
ios遮罩层的简单使用
/** 大图 */ - (IBAction)bigImg { //1.添加按钮遮罩层 UIButton *cover=[[UIButton alloc] init]; cover.frame=self ...