解法(背包DP问题)

(下为转)

其实感觉 像此题这种类型的并不属于dp范畴
虽然程序看起来使用的是递推这一过程,但总不能说开个二重循环就是dp吧
如果只从求解上来讲(不考虑数据值的范围), 只有枚举这唯一途径, 而此题的复杂度为O(20^20), 大约等于 10^26, 微机是很难在短时间内求解的。
而此题还有另一个限制, 就是数据值的范围, 虽然状态数那么多, 但是它们的范围有限这个时候, 状态产生大量重复, 于是, 程序可以优化为压缩这些重复状态, 从而减少开销
在实现的过程中, 确实划分了阶段, 但这个过程更像是枚举, 优化过后的枚举
在朴素枚举当中, 阶段数与复杂度呈指数关系, 而在此题这种特殊情况下, 每个阶段数的最大不同状态数是有限的, 压缩以后就只是常数关系了
所以那 'dp'方程更像是一个'压缩状态'过程, 并没有求最优这一意思, 最后输出是状态数, 并不是最优解
再看一些常见的dp问题, 它们的意义很明确, 一定是求某种最优的结果, 其中普遍存在max,min
最为关键的一点, 凡是能够被dp的问题, 都是p类问题, 它们的复杂度都为多项式表达式
而该题类似的问题, 它们似乎往往都是npc问题, 它们很难有特别有效的算法
像本题这种就是通过狭小的数据范围来进行优化, 但仍然逃不脱枚举这一本质,
如果稍微加大数据范围, 您看看还有更好的方法么?

这道题目是按照平衡度来考虑的,即挂完砝码后整个天平的值,从而可以划分为逐次挂砝码的阶段,则此次挂砝码和上一次的过程就存在了重叠子问题。运用DP就可以

有效的减少状态数。

我们使用DP[i][j]表示挂第i个砝码时平衡度为j的状态数。显然i的范围是1-20,对j来说,砝码重量是1-25,且不同砝码重量两两不同,而挂钩的范围是-15-+15,最多有20个砝码,故取值范围为(5+6+...+25)*15,即-4500~+4500,由此可以确定需要开出的table大小。

代码如下:

 #include<iostream>
using namespace std;
int hook[];
int weight[];
int balance[][]; int main()
{
int hC,wG,i,j,k,value;
cin>>hC>>wG;
memset(balance,,sizeof(balance));
for(i=;i<hC;i++)
{
cin>>hook[i];
}
for(i=;i<wG;i++)
{
cin>>weight[i];
}
for(i=;i<hC;i++)
{
balance[][weight[]*hook[i]+]++;
}
for(i=;i<wG;i++)
{
for(j=;j<;j++)
{
if(balance[i-][j]!=)
{
for(k=;k<hC;k++)
{
value=weight[i]*hook[k];
balance[i][j+value]+=balance[i-][j];
}
}
}
}
cout<<balance[wG-][+]<<endl;
return ;
}

这种方法的复杂度为 O(C*G*9000)

poj1837挂砝码的更多相关文章

  1. POJ 1837 Balance 【DP】

    题意:给出一个天平,给出c个钩子,及c个钩子的位置pos[i],给出g个砝码,g个砝码的质量w[i],问当挂上所有的砝码的时候,使得天平平衡的方案数, 用dp[i][j]表示挂了前i个砝码时,平衡点为 ...

  2. POJ 1837 Balance 01背包

    题目: http://poj.org/problem?id=1837 感觉dp的题目都很难做,这道题如果不看题解不知道憋到毕业能不能做出来,转化成了01背包问题,很神奇.. #include < ...

  3. Uva 1354 Mobile Computing

    题目链接 题意: 在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡. 求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值. 思路 ...

  4. poj 1837 01背包

    Balance Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java clas ...

  5. POJ1837 Balance[分组背包]

    Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13717   Accepted: 8616 Descript ...

  6. dp之二维背包poj1837(天平问题 推荐)

    题意:给你c(2<=c<=20)个挂钩,g(2<=g<=20)个砝码,求在将所有砝码(砝码重1~~25)挂到天平(天平长  -15~~15)上,并使得天平平衡的方法数..... ...

  7. 【个人训练】(POJ1837)Balance

    这几天抓住国庆的黄金时间(因为没有女朋友,天天刷题emmmm 其实还在肝少前还要捞秋刀鱼) ,重点攻克掉几个基本的地方:搜索.dp.图论.这几天的题目应该就是这些范围. 题意 原题的意思大概是这样的, ...

  8. poj1837

    Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12995   Accepted: 8142 Descript ...

  9. POJ1837 Balance 背包

    题目大意: 有一个天平,天平左右两边各有若干个钩子,总共有C个钩子(每个钩子有相对于中心的距离,左负右正),有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数. 将每个砝码看作一组,组内各个物品 ...

随机推荐

  1. 【网络流量-二部图最大匹配】poj3041Asteroids

    /* 这个问题将是每行一个x作为节点x,没有列y作为节点y,障碍物的坐标xy来自x至y的 边缘.图建的问题后,变成,拿得最少的点,因此,所有这些点与相邻边缘,即最小 点覆盖,与匈牙利算法来解决. -- ...

  2. 并查集(Union-Find)算法介绍

    原文链接:http://blog.csdn.net/dm_vincent/article/details/7655764 本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构 ...

  3. NYoj 部分和问题(深搜经典)

    题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=1058 #include <stdio.h> ], vis[], co ...

  4. js之with

    网上找资料的时候看到有js代码里出现了大量的with语句,有点好奇,这里做下总结: 1)简要说明         with 语句可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性. ...

  5. C#操作Xml:使用XmlReader读Xml

    XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO):而在有些场景下我们必须考虑尽可能节省内存和I ...

  6. CSharp设计模式读书笔记(14):职责链模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    职责链模式(Chain of Responsibility  Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象 ...

  7. jQuery按回车键执行指定方法

    1.按Enter键执行指定方法: //按回车进入页面 $(function(){ $(document).keydown(function(event){ if (event.keyCode == 1 ...

  8. 第1章2节《MonkeyRunner源码剖析》概述:边界(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  9. Robotium源码分析之运行原理

    从上一章<Robotium源码分析之Instrumentation进阶>中我们了解到了Robotium所基于的Instrumentation的一些进阶基础,比如它注入事件的原理等,但Rob ...

  10. Robotium源码分析之Instrumentation进阶

    在分析Robotium的运行原理之前,我们有必要先搞清楚Instrumentation的一些相关知识点,因为Robotium就是基于Instrumentation而开发出来的一套自动化测试框架.鉴于之 ...