蓝桥杯赛第10届省赛
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
struct Node {
int weight; //重量
int volume; //体积
int money; //让利金额
} a[N];
/**
测试用例
10 9 4
8 3 6
5 4 5
3 7 7
4 5 4
*/
//在取得最大让利金额的时候,到底是拿了哪些商品?
string s[N][N][N];
//三维数组用来装最大优惠结果集
int yh[N][N][N];
int main() {
//w:可以提起 w 单位重量的东西,
//v:有一个能装v个单位体积的购物袋
//n:为商品种类数
int w, v, n;
cin >> w >> v >> n;
for (int i = 1; i <= n; i++) cin >> a[i].weight >> a[i].volume >> a[i].money;
//三维数组初始化
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= w; j++) {
for (int k = 0; k <= v; k++) {
yh[i][j][k] = 0;
//初始化
s[i][j][k] = "";
}
}
}
//遍历每个种类
for (int i = 1; i <= n; i++) {
//从1开始,一个一个去增加重量尝试
for (int j = 1; j <= w; j++) {
//从1开始,一个个去增加体积尝试
for (int k = 1; k <= v; k++) {
//yh[0]是没有意义的,就是为了数学好算,也就是在未引入i时的上一个最优解
int bn = yh[i - 1][j][k];
int x = 0;
//如果剩余的重量和体积都够用的时候,尝试拿当前物品
if (j >= a[i].weight && k >= a[i].volume)
x = yh[i - 1][j - a[i].weight][k - a[i].volume] + a[i].money;
if (x > bn) { //如果拿了比不拿价值大,就拿这个物品
yh[i][j][k] = x;
//同时记录拿了这个物品
s[i][j][k] = s[i - 1][j - a[i].weight][k - a[i].volume] + " " + (char) (i + '0');
} else {
//否则记录当前重量和体积的最优策略是不拿
yh[i][j][k] = bn;
//同时记录不拿当前物品,保持和之前一样的物品列表
s[i][j][k] = s[i - 1][j][k];
}
}
}
}
//输出
cout << yh[n][w][v] << endl; //小惠能够得到的最大让利金额
string str = s[n][w][v]; //依次为从小到大排列的商品序号
cout << str.substr(1, str.size() - 1);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2014-11-25 Mysql中大表添加索引的办法
2014-11-25 长春市基础教育资源云平台