首页 > 其他分享 >题解:AT_abc032_d [ABC032D] ナップサック問題

题解:AT_abc032_d [ABC032D] ナップサック問題

时间:2024-12-15 21:21:32浏览次数:4  
标签:問題 int 题解 ll ABC032D ans include dp

思路

subtask1

直接暴力搜索即可。

subtask2

普通的 01 背包,直接 \(dp\) 即可。

subtask3

改变 \(dp\) 的状态,设 \(dp_i\) 表示价值为 \(i\) 时用的最小体积,那么就直接在里面找最小值就行。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

typedef long long ll;
const int N = 200005;
ll n, W, v[N], w[N];
bool A = 1, B = 1;
ll dp[N];
ll ans;

void dfs(int x, ll sp, ll sum) {
	if (x > n) {
		ans = max(ans, sum);
		return ;
	}
	if (w[x] <= sp) 
		dfs(x + 1, sp - w[x], sum + v[x]);
	dfs(x + 1, sp, sum);
}

int main() {
	scanf("%lld%lld", &n, &W);
	for (int i = 1; i <= n; i++) {
		scanf("%lld%lld", &v[i], &w[i]);
		if (w[i] > 1000) A = 0;
		if (v[i] > 1000) B = 0;
	}	
	if (!A && !B) {
		dfs(1, W, 0);
		printf("%lld\n", ans);
	}
	else if (A) {
		for (int i = 1; i <= n; i++) {
			for (int j = W; j >= w[i]; j--) 
				dp[j] = max(dp[j], dp[j - w[i]] + v[i]);
		}
		for (int i = 1; i <= W; i++)
			ans = max(ans, dp[i]);
		printf("%lld\n", ans);
	}
	else {
		memset(dp, 0x3f, sizeof(dp));
		dp[0] = 0;
		long long sumv = 0;
		for (int i = 1; i <= n; i++)
			sumv += v[i];
		for (int i = 1; i <= n; i++) {
			for (int j = 200000; j >= v[i]; j--) {
				dp[j] = min(dp[j], dp[j - v[i]] + w[i]);
			}
		}
		for (int i = 1; i <= 200000; i++)
			if (dp[i] <= W)
				ans = i;
		printf("%lld\n", ans);
	}
	return 0;
}

标签:問題,int,题解,ll,ABC032D,ans,include,dp
From: https://www.cnblogs.com/panda-lyl/p/18608746

相关文章

  • 题解:B4070 [GESP202412 五级] 奇妙数字
    思路可以考虑质因数分解,使得最后每一个奇妙数字以及它们的乘积是\(n\)的因数。奇妙数字的定义:\(x=p^a\)。所以在质因数分解的过程中,我们统计每个质因数有多少,然后统计可以分解成多少个奇妙数字。代码#include<iostream>#include<cstdio>#include<cstring>#include<algor......
  • 网站使用CDN出现ttf woff等字体跨域问题解决方案
    如果cdn域名+资源路径是可以通过浏览器url地址栏打开的那么一般是因为nginx配置的原因,找到nginx的配置文件添加以下代码: #允许指定域名访问;location~.*.(eot|ttf|ttc|otf|eot|woff|woff2|svg)(.*){ add_headerAccess-Control-Allow-Originhttp(s)://这里填写你的域名;......
  • [BZOJ3569] DZY Loves Chinese II 题解
    考虑不联通的情况。图不好做,就造一棵生成树出来,由于是无向图,所以只有树边和返祖边。发现在一条树边断开后,生成树会分成两个连通块,由覆盖这条树边的返祖边链接,只有这些返祖边也全部断开,原图才会不联通。想到异或的优良性质。我们给所有返祖边在\([0,2^{63})\)中随机一个值作为......
  • 问题解决:windows主机开机不插屏幕不能自动进入桌面
    操作系统一般都有这种设定,不论是windows还是Linux系统,那就是主机开机不插屏幕不能自动进入桌面操作系统一般都有这种设定,不论是windows还是Linux系统,那就是主机开机不插屏幕不能自动进入桌面。如何解决:给主机插上“屏幕欺骗器”操作系统在启动的过程中,在进入系统之前会读取......
  • P9311 [EGOI2021] Twin Cookies / 姐妹分饼干 题解
    题目传送门/ACrecord思路考虑随机化,前\(100\)次订单的美味值随机生成,最后一次的\(n\)个美味值为前\(100\)次送到的饼干中的任意三个饼干的美味值之和,此时的组合方案数去重后也远大于\(n\),故可以通过。选取饼干和最后的分配直接暴力计算就行,判重可以用map。代码#incl......
  • Java线程命名问题解决
    前言网上冲浪时刷到线程池的文章,想想看自己好像还没在实际场景中设置过线程名称,小小研究一下。研究过程默认命名创建的线程都会有自己的名字,如果不设置,程序会给线程默认的名字,如Thread-0Threadt=newThread(()->{System.out.println(Thread.currentThread().getNam......
  • 牛客周赛 Round 71 题解 更新至 F 题
    Preface随便v的一场,这场难度不高呢,感觉有些小水,不如前面几场的难度,反而字符串那题更难一些。我会在代码一些有必要的地方加上注释,签到题可能一般就不会写了.以下是代码火车头:#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#include<vector>......
  • [AGC029D] Grid game题解
    这题很显然可以用贪心来解。由于先手不动一定会让局数更少,所以先手要能动就动。而后手一定是希望他的石子可以撞到一个障碍物上,这样先手就无法移动了,后手就可以让局数更少。因为先手一定会能动就动,所以后手只能走到横坐标大于纵坐标的障碍物上方。那就很简单了,我们只需要统计符......
  • P11378[GESP202412 七级]燃烧 题解
    闲话花了一个小时。主要原因:条初始值硬控我半小时,题目看错硬控我半小时(悲)。正文看题目,就是求从哪个点出发所得到的所有单调下降序列的总长度最长(这个描述好奇怪,不过意思是对的)。题目中说的是树,但其实可以当做图来做,因为题目中提到的是“节点”,而与父亲儿子节点无关,也就是说儿......
  • P6474 [NOI Online #2 入门组] 荆轲刺秦王 题解
    荆轲将会臭名昭著首先$15$做法很简单,那就是直接`cout<<-1`考虑用BFS来解思路很简单,但是怎么求每个士兵的控制范围呢?直接暴力时间复杂度是$O(nma^2)$当然过不了一定会TLE。所以,只需要差分+前缀和即可。说起来简单,实现起来也简单。然后,单打广搜大家应该都会了,可是出题......