P2563 [AHOI2001]质数和分解,质数+dp背包

f[n]+=f[n-素数]
正确的代码:
#include <bits/stdc++.h>
using namespace std;

const int N=207,INF=203;
int cnt,dp[N],n;
long long prime[N];
bool st[N];

void mTable(){
	for(int i=2;i<INF;i++){
		if(!st[i]) prime[cnt++]=i;
		for(int j=0;prime[j]<=INF/i;j++){
			st[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}//线性筛法
	dp[0]=1;
	for(int i=0;i<cnt;i++){
		for(int j=prime[i];j<=200;j++){
			dp[j]+=dp[j-prime[i]];
		}
	}//打表
}
int main(int argc, char** argv) {
	mTable();
	while(cin>>n){
		cout<<dp[n]<<endl;
	}
	return 0;
}

之前错误的代码
void mTable(){
	for(int i=2;i<INF;i++){
		if(!st[i]) prime[cnt++]=i, dp[i]=1;<<<<<<--------
		for(int j=0;prime[j]<=INF/i;j++){
			st[i*prime[j]]=true;
			if(i%prime[j]==0) break;
		}
	}
    此处无dp[0]=1;<<<<--------------
	for(int i=0;i<cnt;i++){
		for(int j=prime[i];j<=200;j++){
			dp[j]+=dp[j-prime[i]];
		}
	}
}
这里错在背包都是一个一个物品放的,这里由于先在dp里放了,所以比如5,这里由于2和3一开始2和3是素数所以dp[2],dp[3]是1;那么在循环时循环for(int i=2 ,3)时两遍都加了
所以5=2+3=3+2=5 因此错了,注意背包一开始都是空的,然后一个一个物品地放


全部评论

相关推荐

05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务