当前位置: 首页 > article >正文

动态规划背包问题

洛谷P1048采药

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
const int N = 1010, M = 110;
int t[N], w[M];
int f[M][N];//f[i][j]表示前采i个草药前js内能采的最大价值 
int main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		cin >> t[i] >> w[i];
	}
	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= n; j++) {
			if (j < t[i])f[i][j] = f[i - 1][j];
			else f[i][j] = max(f[i - 1][j], f[i - 1][j - t[i]] + w[i]);
		}
	}
	cout << f[m][n] << endl;

	return 0;
}

降维后: 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
const int N = 1010, M = 110;
int t[N], w[M];
int f[N];//f[i][j]表示前采i个草药前js内能采的最大价值 
int main(){
	cin >> n >> m;
	for(int i = 1; i <= m; i++){
		cin >> t[i] >> w[i];
	}
	for(int i = 1; i <= m; i++){
		for(int j = n; j >= t[i]; j--){
			f[j] = max(f[j], f[j - t[i]] + w[i]);
		}
	}
	cout << f[n] << endl;
	
	return 0;
} 

洛谷P1616疯狂采药:注意范围会爆int

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
const int N = 10010, M = 1e7 + 10;
int t[N], w[N];
long long f[M];//注意要long long 
int main(){
	cin >> n >> m;
	for(int i = 1; i <= m; i++){
		cin >> t[i] >> w[i];
	}
	for(int i = 1; i <= m; i++){
		for(int j = t[i]; j <= n; j++){
			f[j] = max(f[j], f[j - t[i]] + w[i]);
		} 
	} 
	cout << f[n] << endl;
	
	return 0;
} 

洛谷P1164小A点菜

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
const int N = 110, M = 10010;
int a[N];
int f[N][M];//f[i][j]表示前i种菜剩余j元最多点菜方案数 
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++)cin >> a[i];
	
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(j == a[i])f[i][j] = f[i - 1][j] + 1;
			if(j > a[i])f[i][j] = f[i - 1][j] + f[i - 1][j - a[i]];
			if(j < a[i])f[i][j] = f[i - 1][j];
		}
	}
	cout << f[n][m] << endl;
	return 0;
} 

 类似01背包做法

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, m;
const int N = 110, M = 10010;
int a[N];
int dp[N][M];
int main(){
	cin >> n >> m;
	for(int i = 1; i <= n; i++)cin >> a[i]; 
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			//只点第i道菜 
			if(j == a[i])	dp[i][j] = 1;
			if(j - a[i] >= 0){
				//点第i种菜 
				dp[i][j] = dp[i][j] + dp[i - 1][j - a[i]] + dp[i - 1][j];
			}
			else{
				//不点第i种菜 
				dp[i][j] = dp[i][j] + dp[i - 1][j];
			}
		}
	}
	cout << dp[n][m] << endl;
	return 0;
} 

记忆化搜索做法

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL f[105][10005],n,m,v[105],ans;
LL dfs(LL c,LL k)
{
    if(f[c][k])return f[c][k];
    if(v[c]>k)return 0;
    if(v[c]==k)return 1;
    for(LL i=c+1;i<=n;i++)f[c][k]+=dfs(i,k-v[c]);
    return f[c][k];
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for(LL i=1;i<=n;i++)scanf("%lld",&v[i]);
    for(LL i=1;i<=n;i++)ans+=dfs(i,m);
    printf("%lld\n",ans);
    return 0;
}


http://www.kler.cn/a/571249.html

相关文章:

  • Celia智能助手系统架构设计与技术实现全解析
  • 深入探索Python机器学习算法:模型评估
  • 投入与专注
  • 【数据库】数据库基础
  • 视音频数据处理入门:颜色空间(二)---ffmpeg
  • 一周学会Flask3 Python Web开发-在模板中渲染WTForms表单视图函数里获取表单数据
  • 大数据测试总结
  • 简易的微信聊天网页版【项目测试报告】
  • GradingPool-Seq使用方法
  • 2025华为OD机试真题目录【E卷+A卷+B卷+C卷+D卷】持续收录中...
  • 【3D格式转换SDK】HOOPS Exchange技术概览(二):3D数据处理高级功能
  • Three.js 入门(光线投射实现3d场景交互事件)
  • 实时音视频通信SDK/API:EasyRTC嵌入式SDK去中心化WebP2P架构设计,Linux、ARM、小程序适配
  • 物联网设备数据割裂难题:基于OAuth2.0的分布式用户画像系统设计!格行代理是不是套路?2025有什么比较好的副业?低成本的创业好项目有哪些?
  • 【实战ES】实战 Elasticsearch:快速上手与深度实践-3.1.3高亮与排序的性能陷阱
  • 网上打印平台哪个好用?网上打印资料推荐
  • 毕业项目推荐:基于yolov8/yolov5/yolo11的暴力行为检测识别系统(python+卷积神经网络)
  • Glide图片加载优化全攻略:从缓存到性能调优
  • Unity3D 刚体动力学(Rigidbody Dynamics)详解
  • 基于模糊PID控制的供热控制系统设计Simulink仿真