这个完全背包用二维数组递推怎么错了
查看原帖
这个完全背包用二维数组递推怎么错了
890321
mooktian楼主2023/11/2 16:43
for(int i = 1;i <= cnt;i++) {
		for(int j = 1;j <= n;j++) {
			f[i][j] = f[i-1][j] + f[i][j-prime[i]];
		}
	} 
	cout << f[cnt][n];

第二个点就错了,只得了60分

把数组改成一维就OK了

for(int i = 1;i <= cnt;i++) {
		for(int j = prime[i];j <= n;j++) {
			f[j] = f[j] + f[j-prime[i]];
		}
	} 
	cout << f[n];

想了很久,还是不太明白是怎么回事,求大神指点。

完整代码如下:

#include <bits/stdc++.h>
using namespace std;
int n,cnt = 1;
int isprime[1005]; 
int prime[1005];
long long f[1005][1005];
void aishishai(int n) {
	for(int i = 2;i*i <= n+1;i++) {
		if(isprime[i] == 0) {
			for(int j = 2*i;j <= n;j += i) {
			isprime[j] = 1;
			}
		}
	}
	for(int i = 2;i <= n;i++) {
		if(isprime[i] == 0) {
			prime[cnt++] = i;
		}
	}
	cnt--;//质数从数组下标1开始 
}
int main( ) {
	cin >> n;
	aishishai(n);
	//for(int i = 1;i <= cnt;i++) {
	//	cout << prime[i] << " ";
	//}
	//数组初始化 f[i][0] = 1
	for(int i = 0;i <= cnt;i++) f[i][0] = 1;
	for(int i = 1;i <= cnt;i++) {
		for(int j = 1;j <= n;j++) {
			f[i][j] = f[i-1][j] + f[i][j-prime[i]];
		}
	} 
	cout << f[cnt][n];
	return 0;
}
2023/11/2 16:43
加载中...