首页 > 其他分享 >P4141 消失之物

P4141 消失之物

时间:2023-11-05 20:22:17浏览次数:42  
标签:代码 背包 取模 int 之物 消失 include 跳过 P4141

P4141 消失之物

基本思路

做\(n\)次计数背包。

当然\(TLE\).

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

using namespace std;

const int N = 2020;
int n, m;
int F[N];
int v[N];

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> v[i];
	}

	for (int p = 1; p <= n; p++)
	{
		memset(F, 0, sizeof(F));
		F[0] = 1;
		for (int i = 1; i <= n; i++)
		{
			if (i == p)
			{
				continue;
			}
			for (int j = m; j >= v[i]; j--)
			{
				F[j] += F[j - v[i]];
			}
		}
		for (int i = 1; i <= m; i++)
		{
			cout << F[i] % 10;
		}
		cout << endl;
	}
	return 0;
}

思路改进

从状态转移的过程入手。

从上面的暴力代码也可以看出,所谓不选就是跳过本次外层循环,也就是跳过一系列关于物品\(i\)的动态规划。暴力运用了\(continue\)。

找到跳过的代码

for (int j = m; j >= v[i]; j--)
{
	F[j] += F[j - v[i]];
}

实际上就是跳过了一整次这段代码,即对\(i\)个物品的动态规划更新。

产生思路

既然只是跳过了一次,并没有必要大费周章地再\(O(n)\)跑一整次\(DP\),针对跳过的这个代码块做文章即可。

可以在所有状态全部更新完之后,枚举不用的背包,针对该层背包,把更新完全部状态的\(F[j]\)受该层背包的影响消除即可。

具体的方法好理解,但是难想出来。

即每次枚举背包时拷贝总答案数组,然后针对该层进行顺序递推减去之前加上的\(F[j - w[i]]\)即可。

代码实现

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

using namespace std;

const int N = 2020;
int n, m;
long long F[N], G[N];
int v[N];

int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
	{
		cin >> v[i];
	}
	F[0] = 1;
	for (int i = 1; i <= n; i++)
	{
		for (int j = m; j >= v[i]; j--)
		{
			F[j] += F[j - v[i]];
			F[j] %= 10;
		}
	}
	for (int i = 1; i <= n; i++)
	{
		memcpy(G, F, sizeof(F));
		for (int j = v[i]; j <= m; j++)
		{
			G[j] -= G[j - v[i]];
			if (G[j] < 0)
			{
				G[j] = (G[j] + 10) % 10;
			}
			else
			{
				G[j] = G[j] % 10;
			}
		}
		for (int j = 1; j <= m; j++)
		{
			cout << G[j] % 10;
		}
		cout << endl;
	}
	return 0;
}

实现细节

数组拷贝

用到了memcpy这个函数,很方便的拷贝数组。

取模运算

首先还是经典的同余根本不懂,每次运算完后都取模。还有就是考虑负数情况,要先加模数变成整数再取模。

标签:代码,背包,取模,int,之物,消失,include,跳过,P4141
From: https://www.cnblogs.com/kdlyh/p/17811076.html

相关文章

  • 计算机图形学中的正交透视——从平行线消失点开始
    平行线消失点在我们日常生活中,会发现这样一类现象:在照片或者图画上,原本是平行的物体(比如铁轨轨道,公路等)会随着他们的延伸逐渐相交于视野尽头,这个尽头就被称作消失点,类似于下面这幅图所显示的内容:为什么原本平行的物体会出现这样的现象呢?我们可以从几何光学的角度直观的分析一下......
  • 风靡一时的【数据分析师】岗位正在逐步消失
    风靡一时的【数据分析师】岗位正在逐步消失哈喽,大家好呀!好久不见,今天因本人所在城市大雨不停,宅在家里就和大家一起“吐槽”一下【数据分析师】这个岗位吧,本文仅仅是吐槽哈。1、【数据分析师】岗位是做什么的呢?说到数据分析,其实就是字面意思,通过数据,进行分析,得出结论和建议,简单哈。......
  • 启动引导Grub消失的修复方案
    故障现象:笔记本启动时未出现启动引导,卡在Lenovo图标界面。触发原因:磁盘空间已满,重启电脑时无法成功启动。修复方法:外接LinuxU盘启动盘,安装并执行boot-repair工具。$sudoadd-apt-repositoryppa:yannubuntu/boot-repair$sudoaptupdate$sudoaptinstallboot-repair......
  • 小技巧 | 渐变消失遮罩的多种实现方式
    我的小册 《CSS技术揭秘与实战通关》上线了,想了解更多有趣、进阶、系统化的CSS内容,可以猛击- LINK。在知乎看到一题比较有意思的题目。题目大致是如何实现下述图片的效果,如果使用div前置遮挡的话,会影响div后面的按钮,使其无法被点击。本文将简单介绍几种这个效果的......
  • centos7 中 用户名和主机名消失,显示-bash-4.2解放方法
     001、问题,centos7中中用户名和主机名消失,显示-bash-4.2,如下:-bash-4.2$ 002、产生原因配置文件丢失或意外删除。 003、解决方法1-bash-4.2$echo"exportPS1='[\u@\h\W]\$'">>~/.bash_profile-bash-4.2$source~/.bash_profile[liujiaxin01@pc1~]$ls[liuj......
  • 336_Windows磁盘空间莫名消失?用它,立刻解决!
    这是一篇原发布于2020-02-0215:41:00得益小站的文章,备份在此处。前言随着我们日常的使用,下载各类文件,不知不觉间,电脑空间已经爆满。打开我的电脑,却已发现C盘已变成红色,这时,我们不禁要发出疑问——我的磁盘空间到底去了哪里?利用win10“存储”解决应用和功能1.点击开始——打......
  • 【Ynoi2018】天降之物
    【Ynoi2018】天降之物题意给定一个长为\(n\)的序列\(a\),支持两种操作:将所有\(a_p=x\)修改为\(y\)。查询\(\min(|i-j|)\),满足\(a_i=x\anda_j=y\)或者\(a_i=y\anda_j=x\)。题解考虑序列分块,首先考虑块内贡献,设块长为\(B\),由于分块的\(B\)一......
  • Windows磁盘空间莫名消失?用它,立刻解决!
    这是一篇原发布于2020年02月02日得益小站的文章,备份在此处。前言随着我们日常的使用,下载各类文件,不知不觉间,电脑空间已经爆满。打开我的电脑,却已发现C盘已变成红色,这时,我们不禁要发出疑问——我的磁盘空间到底去了哪里?利用win10“存储”解决应用和功能1.点击开始——打开设......
  • 如何下载消失的历史版本
    引言 历史版本,是一种记忆、更有一种留恋,甚至是一种依赖。新手机,有很多老版本根本无法安装运行,但对于仍在“发光发热”的老手机,新版本又太过臃肿或没有支持的组件而无法运行或流畅运行。但最近发生的一些事情,这个所谓的历史版本,正在渐渐地被迫退出历史舞台。消失的历史版本 ......
  • 消失之物
    P4141消失之物是一种被称为退背包的背包。我们先求出不删除任何一个数的答案,这就是一个经典的背包问题,可以使用空间优化。然后,我们考虑删除一个数。我们有一个重要的性质:物品的顺序与方案数无关,如\(1,2,3\),\(2,1,3\)没有区别。于是,我们可以将要删除的这个数看作刚刚插入。......