首页 > 其他分享 >P4141 消失之物题解(写给每一位与我一样的新手玩家)

P4141 消失之物题解(写给每一位与我一样的新手玩家)

时间:2024-02-20 22:45:16浏览次数:38  
标签:10 背包 题解 之物 回退 P4141 dp

消失之物

传送门:

P4141 消失之物 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路

暴力稳了

但是

hack

tle了

这时候我们要想办法优化

这是一个回退背包问题

首先第一步,我们把正常的背包(n间物体)求出来,然后就是板子,求出填满当中体积有多少种方法

第二步就是回退,

回退的关键问题有两个:

  1. 回退的点该怎么找
  2. 只把由当前物品组成的情况删除

解决这两个问题就是会了回退,会了回退就是解决问题了

这两个关键点分两步解决:

  1. 当前背包容量小于我需要回退的物品时,说明我当前压根没有带走该物体,所以当前的刚好填满的方法数量还是不变

  2. 当我背包容量大于等于我需要回退的物品时,说明我当前正好可以填满的方法中有部分方法是由本该退回的物品组成的,至少为1(因为当前背包容量等于当前物品体积的时候,这是肯定为一种情况的)

    • 第二点用以下代码解决

      f[j]=(dp[j]-f[j-a[i]]+10)%10;//dp表示原来n件物品的背包,f表示拿掉第i件的背包恰好填满的情况
      //原方法总数-由退回物品组成的方法总数
      //为什么f[j-a[i]]是退回物品的方法总数呢?
      //因为a[i]与j-a[i]才能恰好组成j也就是当前背包容量,一件a[i]与n件j-a[i]可以恰好组成n种方法
      //还有个问题,其实我一开始在思考这里回退j-a[i]的时候会不会把之前已经回退过的二次回退导致答案变小呢
      //事实是不会的,完全多想
      //因为每次只考虑一个物品所以不搭嘎,因为这里的关系是关联关系,j-a[i]的方法总数是影响a[i]的方法总数,所以这边就算收到影响也是因为j-a[i]受到了影响,那么j-a[i]受到影响这个方法总数肯定是会受到影响的。
      //这里有点绕,有兴趣可以思考一下后半句,初学者只要牢记前半句就行;
      

tips:这里的mod 10在每次计算的时候就可以做了,建议求出来的时候先+10再取模,有情况下是看你去负的。

上面的问题都是本人自己写题思考看题解学习,写给每一位跟我一样新入门的同学看!

有问题请评论或私信我,谢谢!

AC code

// Problem: 
//     P4141 消失之物
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4141
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<iostream>
#include<algorithm>
//#include<cstdio>
#include<cstring>
#define ll long long 
#define endl '\n'
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define N 2100 //1e6+100 
 
using namespace std;
int n,m,a[N],dp[N],f[N];
int main(){
	//ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	rep(i,1,n) cin>>a[i];
	dp[0]=1;
	rep(i,1,n){
		per(j,m,a[i]){
			dp[j]+=dp[j-a[i]];
			dp[j]%=10;
		}
	}
	rep(i,1,n){
		f[0]=1;
		rep(j,1,m){
			if(j<a[i])f[j]=dp[j]%10;
			else f[j]=(dp[j]-f[j-a[i]]+10)%10;
			cout<<f[j];
		}
		cout<<endl;
	}

	return 0; 
} 

标签:10,背包,题解,之物,回退,P4141,dp
From: https://www.cnblogs.com/Illuminated/p/18024208

相关文章

  • luogu5021题解
    形式化题意:在一棵树上找\(m\)条没有重复边的路径,使得最短的路径最大,求这个最短路径的最大值。看到这个最大值就想二分答案。\(1\lem\len-1\),我们可以将长度的下限为最短的那条边,此时所有边都是符合要求的路径。长度的上限为所有路径的长度除以\(m\),向下取整。我们在判断......
  • 2024年2月20号题解
    P5594【XR-4】模拟赛解题思路重点是怎么判断是不是同一套模拟题用一个数组来标记是不是同一套题代码实现#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#include<time.h>#include<stdbool.h>#defi......
  • B3893 [NICA #3] 一键三连 题解
    本文同步发布于洛谷博客水题啊,我发现chen_zhe上传的水题这么多呢?难道kkksc03把水题都交给他上传了?题意简述输入两个整数\(x\)和\(y\),输出\(x+y\times2\)。我能直接上代码吗好的,让我们通过做题认识一下相关的知识点:YF001int类型与输入输出YF002数与数之间的运......
  • 线段树-山海经 题解
    《最痛苦的一集》从开始的找维护变量到依据i比较依据y比较最后发现问题出在没初始化(如果不将答案赋值为极小值那么它最小值就是0因此wa了无数遍下面是思路首先要维护的变量有:\(区间的左右边界\,l,\,r\)\(区间的答案\,ans\)\(含左端点最大值\,lans\,和含右端点最......
  • 【解题报告】【比赛复现】洛谷入门赛 #17 题解
    洛谷入门赛#17题解今日推歌:《春嵐feat.初音ミク》john感觉这首都快成周榜战神了(Before关于我做入门赛的精神状态:没做T4,因为题面读得我头疼……而且大模拟不想做(虽然也不是多大的模拟展开目录目录洛谷入门赛#17题解BeforeA食堂B数学选择题AfterC风球E式神考核Af......
  • CF1905D Cyclic MEX 题解
    题意:给定一个长度为\(n\)的排列\(a\),\(a_i\in[0,n-1]\)。你可以将这个排列进行循环移位,最小化\(\sum_{i=1}^{n}\text{mex}_{j=1}^ia_j\)的值。首先我们可以先计算出最初情况下每一个\(i\)位置的\(\text{mex}\)值。这个序列一定是单调非严格递增的。首先有一个比......
  • CF1893B Neutral Tonality 题解
    很巧妙的一道题。为了让\(\text{LIS}\)长度最小,我们肯定先将\(b\)数组降序排序,这样\(b\)自身对\(\text{LIS}\)的贡献最小。考虑是否存在一种插入方式使得最终\(a\)的\(\text{LIS}\)长度和最初\(a\)的\(\text{LIS}\)长度相等。这时我们会发现,如果我们插入\(b\)......
  • CF638C题解
    我们可以针对一个顶点只能同时修一条边这个条件设计方案。由于每条边都要修一遍,同样某天修理的方案放在哪一天修都无所谓,我们采用贪心的策略,在原有的方案上尽可能多地修边。根据上面的性质,我们只需要将同一顶点的边放在不同的某天修理的方案中,使方案尽可能的少即可。跑一遍dfs......
  • Docker 使用遇到的问题解决 更改Tag
    dockertagconsul:1.15.4consul:latestdockerrmiconsul:1.15.4删除制定版本在运行时,有些镜像拉取时报错我这里 时 consu,只能制定版本下载1.15.4Errorresponsefromdaemon:manifestforconsul:latestnotfound:manifestunknown:manifestunknown ......
  • P2171 Hz吐泡泡 题解
    传送门题目背景Hz大大是一种可爱的动物(神)。他很喜欢吐泡泡(更喜欢写作业)。题目描述这天,Hz大大心血来潮,吐了n个不同的泡泡玩(保证没有重复的泡泡)。因为他还要写作业,所以他请你帮他把这些泡泡排序成树(左子树<=根<右子树)。输出它的后序遍历。输入格式共2行。第一行,1个整数n。(1<......