基础组难度的题都调不出来了

一道 01 背包硬控我半小时

#define Code using
#define by namespace
#define stringdp100005 std
#include<bits/stdc++.h>
Code by stringdp100005;
int n,dp[205];
int pr[205],c;
bool vis[205];
void init(){
	for(int i=2;i<=200;i++){
		if(!vis[i]) pr[++c]=i;
		for(int j=1;j<=c&&i*pr[j]<=200;j++){
			vis[i*pr[j]]=1;
			if(i%pr[j]==0) break;
		}
	}
}
signed main(){
	init();
	cin>>n;
	for(int i=1;i<=c;i++){
		for(int j=n;j>=pr[i];j--){
			dp[j]=max(dp[j],dp[j-pr[i]]+1);
		}
	}
	cout<<dp[n];
	return 0;
}
2 个赞

调出来了吗(我登上大号了)

image
差点被你骗了原来是黄题不敢恭维

(作者已删除帖子)

不能连续三次我先用这个号回复一下

1 个赞

(作者已删除帖子)

我AC了,破案了是初始化问题

image
我们先将所有的dp[i](除了dp[0])定义为-1,定义若dp[i]=-1则i是分解不了的,所以我们后面的代码若dp[j-pr[i]]是-1则不执行状态转移语句。那么在执行第一遍循环时,我们注意到,如果我们想满足dp[j-pr[i]]非-1那么只有可能j-pr[i]=0,也就是j=pr[j]。接着往后推,就可以执行完整个语句。

具体点来说就是如果dp[j]初始化0那么在状态转移时,若j-pr[i]分解不了,dp[j]就还是会变这时后面都会错了

?啊

1 个赞

不能连续回复三次?

1 个赞

有这个规定嘛 @2345安全卫士 (吓得我也不敢再发了

1 个赞

系统会自动提示的,不让你发了

哦好吧

1 个赞

有没有可能这个对管理无效

哦,原来如此,太久不当正常用户了,完全忘了

1 个赞