文章

11

粉丝

27

获赞

19

访问

1.2k

头像
疑问:请问内层循环为什么要从大到小啊?
P1035
发布于2025年1月25日 12:33
阅读数 113

一维数组要从大到小遍历我能理解,二维数组的第二个for循环为什么也要从大到小才行呢?

 

//1035-简单背包问题
#include<bits/stdc++.h>
using namespace std;

int main(){
	int s,n;
	while(cin>>s>>n){
		int w[n+1];
		int dp[n+1][s+1];
		for(int i=1;i<=n;i++){
			cin>>w[i];
		}
		memset(dp,0,sizeof(dp));
		dp[0][0]=1;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=s;j++){                   //这里j必须从大到小才行,为什么? 
				if(dp[i-1][j]==1) dp[i][j]=1;
				else if(j-w[i]>=0){
					if(dp[i-1][j-w[i]]==1) 
					dp[i][j]=1;
				}
			}
		}
		if(dp[n][s]==1) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	} 
} 

 

登录查看完整内容


登录后发布评论

4 条评论
admin SVIP
2025年1月25日 14:53

可以结合高分篇和满分篇的背包问题来看,搞懂了怎么从二维数组压缩为滚动数组再压缩为一维数组你就知道怎么改了。

赞(0)

123456608 : 回复 admin: 我知道一维数组是因为后面的数据要用到前面的未更新的数据,所以从后往前遍历。可是二维数组为什么也需要从后往前遍历呢,第i-1行的数据不是可以直接访问到吗

2025年1月25日 15:43

admin : 回复 123456608: https://noobdream.com/DreamJudge/Issue/code/676952/

2025年1月25日 16:48

123456608 : 回复 admin: 谢谢佬,我悟了

2025年1月25日 19:37