• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
 






tim11

 
 

Powered by 博客园
博客园 | 首页 | 新随笔 | 联系 | 订阅 订阅 | 管理

2012年8月16日

poj 3260 The Fewest Coins(多重背包+完全背包)
摘要: http://poj.org/gotoproblem?pid=3260(1)多重背包的处理方式:转化为分组背包(1,2,4,8,余数)。具体细节参见代码:scanf("%d", &num[i]);tn=num[i];while(tn>0){ if(tn<x) {map[i][tot++]=tn;break;} map[i][tot++]=x; tn-=x; x*=2;}(2)接下来是装多重背包,注意细节 for(j=0;map[i][j];j++) 而不是 for(j=1;map[i][j];j++) 进而用万群被白调整,注意循环顺序:for(k=V-m 阅读全文
posted @ 2012-08-16 21:05 tim11 阅读(147) 评论(0) 推荐(0)
 
poj 2063 Investment(01背包变形)
摘要: http://poj.org/gotoproblem?pid=2063(1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环;(2)本题出现了各种错误:1)刚开始,没注意 m 变大会影响 dp 的上限,开了个dp[1100000], RE; 2)由于 m 的只比较大, 开了个dp[8000000],MLE(内存不够); 3)改小为dp[5000000], TLE(超时); 4)为什么要开这么大数组,好像是因为 m 太大了。。 重新读题, The value of a bond is alway... 阅读全文
posted @ 2012-08-16 19:56 tim11 阅读(162) 评论(0) 推荐(0)
 
poj 1252 Euro Efficiency (01背包变形)
摘要: http://poj.org/gotoproblem?pid=1252(1)不是单纯的01背包问题,硬币有去有回(即有正有负),这使得用想买你的解法,上限难以确定,所以我开了dp[10000]的数组,还未得到好的优化和解释;(2)对比两种写法:1)for(i=1;i<=6;i++) for(j=a[i];j<=N;j++) dp[j]=min(dp[j], dp[j-a[i]]+1);for(i=1;i<=6;i++) for(j=N-a[i];j>=0;j--) dp[j]=min(dp[j], dp[j+a[i]]+1); 2)for(i=1;i<=... 阅读全文
posted @ 2012-08-16 19:00 tim11 阅读(157) 评论(0) 推荐(0)
 
poj 1384 Piggy-Bank (完全背包)
摘要: http://poj.org/gotoproblem?pid=1384普通的完全背包问题,稍微注意: for(j=w[i];j<=f-e;j++)具体代码:View Code #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;const int Inf = (1<<29);int t, e, f, n;int p[550], w[550];int dp[10100];int main(){ int i, j, k; while(scanf(&q 阅读全文
posted @ 2012-08-16 18:22 tim11 阅读(189) 评论(0) 推荐(0)
 
hdu 3535 AreYouBusy(三种背包)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3535(1)本题是三种背包的综合应用, 至少选一种、最多选一种、任意选;(2)边读入边处理,可以节省一定的空间,也是代码更加清晰(如 m 就不用开数组m[120]);(3)初始化细节: 1)for(j=0;j<=t;j++) dp[i][j]=-(1<<28); 2)for(j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; 3)for(j=0;j<=t;j++) dp[i][j]=dp[i-1][j]; 写题时, 我用了for(j=0... 阅读全文
posted @ 2012-08-16 16:33 tim11 阅读(130) 评论(0) 推荐(0)
 
hdu 1712 ACboy needs your help(分组背包)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1712(1)本题为分组背包问题,是基本类型。dp的核心是:for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k=m;k>=j;k--) dp[i][k]=max(dp[i][k], dp[i-1][k-j]+a[i][j]), dp[i][k]=max(dp[i][k], dp[i-1][k]); //被我忽略的一行我在写这题时,少掉了最后一行,一直WA,本质上是要对dp[i][k]赋予初值dp[i-1][k]:f... 阅读全文
posted @ 2012-08-16 15:03 tim11 阅读(121) 评论(0) 推荐(0)
 
hdu 3033 I love sneakers!(分组背包)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=3033(1)本题为分组背包问题,输入时将数据存入到结构体中:struct node{ int p[120], v[120], tot;}brand[12];(2)每组至少要取一个,处理方式不叫特殊,自然也是本题的关键。首先要初始化:for(i=1;i<12;i++) for(j=0;j<=m;j++) dp[i][j]=-(1<<28);即除了 i=0 以外,均是非法数据(注意,i=0 的一组千万不能赋负无穷)。之后是核心的部分:for(i=1;i<=k;i++) for(j=. 阅读全文
posted @ 2012-08-16 14:23 tim11 阅读(153) 评论(0) 推荐(0)
 
hdu 2955 Robberies(01背包)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2955(1)概率的预处理(常识):rp[i]=1-rp[i],并将概率相乘。若将概率相加(定式思维),案例是可以全过的,就麻烦了。。(2)初始化dp数组:偷走0百万是安全的,这很关键(dp[0]=1),其他的都是危险的(dp[i]=0),因为背包必须装满;(3)用sum 记录最大可能出现的值,结果也是从sum开始验证,符合安全条件的输出。具体代码:View Code #include<stdio.h>#include<stdio.h>#include<algorithm>u 阅读全文
posted @ 2012-08-16 13:09 tim11 阅读(131) 评论(0) 推荐(0)
 
hdu 1203 I NEED A OFFER!(01背包)
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1203(1)用到概率的一点常识,预处理:b[i]=1-b[i];(2)注意n和m的个子含义,n为钱数, m为组数,不能错用(如初始化时将m当做n用。。)(3)此题为简单的01背包问题。具体代码:View Code #include<stdio.h>#include<stdio.h>#include<algorithm>using namespace std;int n, m;int a[11000];float b[11000], dp[11000];int main(){ 阅读全文
posted @ 2012-08-16 12:43 tim11 阅读(145) 评论(0) 推荐(0)
 
opj 1948 Triangular Pastures(dp)
摘要: http://poj.org/problem?id=1948(1)用dp[i][j] 表示三角形的边为 i, j 存在与否,本质是对枚举的优化(dp), 另外,上限可取sum/2;(2)将 double p=sum/2.0 写错成 double p=sum/2,后果很严重;(3)存在两种更新方式: 1)for(i=1;i<=n;i++) for(j=sum/2;j>=0;j--) for(k=sum/2;k>=0;k--) { if(j>=a[i]) dp[j][k]=dp[j][k]||dp[j-a[i]][... 阅读全文
posted @ 2012-08-16 12:12 tim11 阅读(172) 评论(0) 推荐(0)
 
opj1837 Balance(dp)
摘要: http://poj.org/problem?id=1837(1)用dp[i][j]表示挂了 i 个重物时 平衡度为 j 的数目;(2)核心部分:for(j=1;j<=m;j++) for(k=0;k<=15000;k++) if(dp[j-1][k]) for(i=1;i<=n;i++) dp[j][k+c[i]*g[j]]+=dp[j-1][k];其中, j 表示重物编号, k 是背包, i 为所挂位置。注意循环的顺序,先确定重物,再打开背包,最后逐个转移平衡度。(3)由于力矩的变化才是本题的关键,将中间位置设为平衡位... 阅读全文
posted @ 2012-08-16 11:54 tim11 阅读(141) 评论(0) 推荐(0)