首页 > 其他分享 >【题解】[HNOI2007]梦幻岛宝珠

【题解】[HNOI2007]梦幻岛宝珠

时间:2023-03-28 09:34:43浏览次数:36  
标签:梦幻岛 int 题解 35 背包 HNOI2007 txt

题目分析:

对于这种某一个值很大另一个值很小的背包题,就是要求找特殊性质。
既然每一个 \(w\) 都可以写成 \(a \times 2^b\) 的性质,就可以对于每一个 \(b\) 单独做背包,这样的复杂度并不高,这样就可以得到 \(f_{i,j}\) 表示第 \(i\) 位选择 \(j\) 个的最大价值。
对于背包合并其实并不简单,我们可以考虑设 \(g_{i,j}\) 表示考虑了前 \(i\) 位,第 \(i\) 位有 \(j\) 个,且最终的重量的前 \(i-1\) 位不超过 \(W\) 的前 \(i-1\) 位的最大价值。
其实这个状态也就相当于一个背包然后加上了一个重量的限制。
转移其实就是 \(g_{i,j} = \max\{g_{i,k} + f_{i-1,2 \times (j-k) + dig(W,i-1)}\}\) 其中 \(dig(W,i)\) 表示 \(W\) 的第 \(i\) 位是 \(0\) 还是 \(1\)。

代码:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int tot[35],w[35][104],v[35][105],f[35][1005],g[35][5005];
signed main(){
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	int n,m;scanf("%lld%lld",&n,&m);
	while(n != -1 && m != -1){
		for(int i=1; i<=n; i++){
			int x,y;scanf("%lld%lld",&x,&y);
			int cnt = 31;
			while(x % (1<<cnt) != 0)	cnt--;
			++tot[cnt];
			v[cnt][tot[cnt]] = x / (1<<cnt);
			w[cnt][tot[cnt]] = y;
		}
		for(int i=0; i<=30; i++){
			for(int j=1; j<=tot[i]; j++){
				for(int k=tot[i]*10; k>=0; k--){
					if(k - v[i][j] >= 0)	
						f[i][k] = max(f[i][k],f[i][k-v[i][j]] + w[i][j]);
				}
			}
		}
		for(int i=0; i<=tot[0]*10; i++){
			g[0][i] = max(g[0][i-1],f[0][i]);
		}
		for(int i=1; i<=30; i++){
			for(int j=0; j<=n*10; j++){
				for(int k=0; k<=j; k++){
					g[i][j] = max(g[i][j],f[i][k] + g[i-1][2 * (j - k) + ((m >> (i-1)) & 1)]);
				}
			}
		}
		int res = 0;
		while(m > (1<<res))	++res;--res;
		printf("%lld\n",g[res][1]);
		scanf("%lld%lld",&n,&m);
		memset(tot,0,sizeof(tot));memset(f,0,sizeof(f));memset(g,0,sizeof(g));
	}
	return 0;
}

标签:梦幻岛,int,题解,35,背包,HNOI2007,txt
From: https://www.cnblogs.com/linyihdfj/p/17263814.html

相关文章

  • 【题解】[APIO2010] 信号覆盖
    题目分析:其实就是涉及四个点之间的位置关系,三个点形成圆判断是否包含另一个点。考虑四个点之间形成的多边形只可能是凸四边形或者是凹四边形,如下图所示:(上图为凸多边形)......
  • 【题解】Atcoder ABC295 A-G
    A.ProbablyEnglish题目分析:直接每一个单词判一下就好了。代码:点击查看代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ intn;scanf("%d",&n); bo......
  • CF743B Chloe and the sequence 题解 分治
    题目链接:http://codeforces.com/problemset/problem/743/B题目大意:对于一个n-序列,如果n==0,那么它是一个空的序列(也就是说空序列中没有元素)。然后会进行i次操作,每次......
  • CF768B Code For 1 题解 分治
    题目链接:http://codeforces.com/problemset/problem/768/B解题思路:分治。本题和的解题思路相似。tips:如果如果\(n\)对应的区间完全被\([l,r]\)覆盖了,则区间\([......
  • leetcode-841-钥匙和房间 题解
    题目描述有N个房间,开始时你位于0号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间i都有一个钥匙列表r......
  • 【ACM算法竞赛日常训练】DAY4题解与分析【树】【子序列】| 组合数学 | 动态规划
    DAY4共2题:树(组合数学)子序列(dp,数学)......
  • 「题解」ABC290F Maximum Diameter
    没动脑子就gf一路写下来了......实际上就是把插板法的gf写了一下/zk首先考虑一下一个\(X\)合法是什么情况,那就是总和是\(2n-2\)并且保证\(0<X_i<n\)。证明就考......
  • [ABC295Ex] E or m 题解
    状压dp,2hd4me/ng。题意开始你有一个全\(0\)矩阵,你可以随意执行如下操作:选择任意一行,将其从最左端开始的连续一段染成\(1\)。选择任意一列,将其从最上端开始的连......
  • 省选联考 2018 题解
    感觉有的歌确实不适合中午刚起来脑袋晕晕乎乎的就去听。太舒缓或者太激烈都不太好。太舒缓容易让人想睡回去,比如我今天中午打了半个小时哈欠。太激烈的……想象一下中午如......
  • AT_abc295_d 题解
    一、题目描述:给你一个由数字0~9组成的字符串,长度为N(1<=N<=500000)。求出满足1<=l<=r<=N且在l~r区间内所有数字都出现了偶数次的整数对l,r有多少对。......