详细注释的代码,解释背包原理

参考代码:

#include using namespace std;
const int N = 1000 + 50;
int t1[N],val[N];//t1[i] 表示编号为i的药材所需要的时间,val[i]表示的是编号为i的药材价值 
int dp[N][N];//行表示待选个体的编号(从1开始),列表示限制条件的大小 
//对于背包问题,行就是选择要装的东西编号,列就是
// 枚举的背包体积,而此题的行就是待选药材的编号,列就是时间的枚举 

int t,m;//t记录总时间和  m 记录待选药材数 
void way(){//处理dp数据 ,dp数组初始化为0
//dp[i][0] = 0;表示的是时间为0时 从编号为前i的所有药材中选出满足条件的(整体价值最大)
//显然时间为0时所有药材都无法放入,故其最大价值为0
//dp[0][i] = 0;表示没有待选药材,无论时间有多少,没有药材那么他的最大价值也为0 
	for(int i=1;i<=m;i++){//从加入第一个待选药材起 遍历完善 不同时间下的最大价值 
		for(int j=1;jj) {//如果选择这个药材需要的时间大于现在有的时间,那么这个药材就不能选择 
				dp[i][j] = dp[i-1][j];//那么这个条件下的最大值就是相同时间下前i-1个编号的最大值 
			}
			else{//现在有的时间充足,可以选择这个药材
			//可以选择不等于一定选择,可能因为选择了他而导致时间不够而放弃
			//选择在此编号之前更有价值的药材 (要把时间给到更有价值的药材上)
			//因此可以选择  又有 选 和 不选 两种情况 
			//dp[i-1][j]表示如果不选情况和上面一致  此时最大值就是相同时间下前i-1个编号的最大值 
			//dp[i-1][j-t1[i]] + val[i] 如果选上,就要给他预留时间(t1[i]), 
			//在其余时间(j-t1[i])里去从i-1个药材种选出最大价值,再加上这个药材有的价值 
			//在二者中选出最大值 
				dp[i][j] = max(dp[i-1][j],dp[i-1][j-t1[i]] + val[i]);
			}
		}
	}
}
void solve(){//数据初始化 
	cin>>t>>m;
	memset(dp,0,sizeof(dp));
	memset(t1,0,sizeof(t1));
	memset(val,0,sizeof(val));
	for(int i=1;i>t1[i]>>val[i];
	}
	way();
	cout<<dp[m][t];//直接输出在总时间t下,i个药材的最大价值 
}
int main(){
	solve();
	return 0;
}

简介代码:

#include using namespace std;
const int N = 1000 + 50;
int t1[N],val[N];
int dp[N][N];
int t,m;
void way(){
	for(int i=1;i<=m;i++){
		for(int j=1;jj) dp[i][j] = dp[i-1][j];
			else{
				dp[i][j] = max(dp[i-1][j],dp[i-1][j-t1[i]] + val[i]);
			}
		}
	}
}
void solve(){
	cin>>t>>m;
	memset(dp,0,sizeof(dp));
	memset(t1,0,sizeof(t1));
	memset(val,0,sizeof(val));
	for(int i=1;i>t1[i]>>val[i];
	}
	way();
	cout<<dp[m][t];
}
int main(){
	solve();
	return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论