/
第一个多重背包题目 真的不理解二进制优化
/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(k
weight,kvalue,c);
count-=k;
k+=k;
}
zeroOne(count
weight,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 (多重背包 搜索)的更多相关文章

  1. hdu 1059 Dividing(多重背包优化)

    Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  2. 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 ...

  3. hdu 1059 Dividing 多重背包

    点击打开链接链接 Dividing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. Dividing 多重背包 倍增DP

    Dividing 给出n个物品的价值和数量,问是否能够平分.

  5. POJ 1014 Dividing 多重背包

    Dividing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63980   Accepted: 16591 Descri ...

  6. POJ 1014 Dividing(多重背包, 倍增优化)

    Q: 倍增优化后, 还是有重复的元素, 怎么办 A: 假定重复的元素比较少, 不用考虑 Description Marsha and Bill own a collection of marbles. ...

  7. POJ 1014 / HDU 1059 Dividing 多重背包+二进制分解

    Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...

  8. hdu1059 Dividing ——多重背包

    link:http://acm.hdu.edu.cn/showproblem.php?pid=1059 最简单的那种 #include <iostream> #include <cs ...

  9. R - Dividing 多重背包

    来源poj1059 Marsha and Bill own a collection of marbles. They want to split the collection among thems ...

随机推荐

  1. PetaPoco 存储过程

    1 执行不带参数的存储过程 public List<dynamic> ceshiProc() { string sql = @"EXEC [dbo].[p_ceshi1]&quo ...

  2. objectiv-c所有对象之间的交互是如何实现的?

    在对象间交互中每个对象承担不同的角色,总的来说就是“数据发送者”和“数据接收者”两个角色.可以通过objective-c中给我们提供的手段来实现两者间的通讯.比如: “通知中心”NSNotificat ...

  3. cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能

    cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...

  4. hdoj 2601(判断N=i*j+i+j)

    Problem E Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  5. [FindBugs分析记录]Redundant nullcheck of o,which is known to be non-null

    官网解释: This method contains a redundant check of a known non-null value against the constant null. 这种 ...

  6. Why is 0[0] syntactically valid in javascript?

    Why is 0[0] syntactically valid in javascript? 原文链接 偶然在一篇帖子中看到了这个问题,所以打算记录一下. var a = 0[0]; console. ...

  7. To Build A Dev Env On Linux(Ubuntu)

    Step1:System Installing 1)use iso image to Step2:Configuration Step3:Software Installing Step4:Other ...

  8. linux配置记录

    今天想把开发环境都配置到linux环境来,所以用wubi挂载了个ubuntu系统(64位),因为不常使用linux所以把今天学到的一些 东西记下来以做备查. #1.   java环境配置 到oracl ...

  9. uboot环境变量分析

    uboot的环境变量在程序的运行和调试过程中都发挥着比较重要的作用. 一.环境变量 可以理解为全局变量,但是他的生命周期比全局变量要长,当程序已经结束运行时,全局变量就会消亡,但是环境变量在下次上电运 ...

  10. 单元测试不是梦,Android+PowerMock系列(1) —— 在Eclipse里搭建测试环境

    单元测试不好搞阿,虽然从TDD角度出发,可测性强的代码很大程度上就代表着好的设计,但是有些情况也是没办法的,比如单例模式,比如Static方法,比如Final类,传统的Mock技术是没办法解决这些问题 ...