1、掌握动态规划基本思想,学习动态规划使用动态规划步骤及了解概念;
2、编译一道程序,深入了解动态规划应用思想;
3、总结实验;
硬件环境:
cpu型号:11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
主频内存型号:2.42 GHz
容量:16+512
软件环境:
操作系统版本号:22631.3296
网站:
软件版本:Microsoft Visual Studio 2022
小华是一个精明的购物者,他正在参加一个特别的促销活动。商店里有 N 种
商品,每种商品都有一个价值和一个重量以及限购数量。小华希望在不超过他
的承重 W 以及单个商品限购数的情况下,购买尽可能高总价值的商品。
输入共两行,第一行为两个正整数 N 和 W,分别表示商品数量和小华的承重
。
接下来有 N 组数据,每组三个整数 wi,vi,si 用空格隔开,分别表示第 i 种
物品的体积、价值和限购数量。
一行,一个整数表示小华可以获得的最大总价值。
4 5
2 10 2 1 3 1 4 6 1 2 8 1
23
1、程序代码:
Problem: 1443
User: 20220440137 [22软工04班陈东]
Language: C++
Result: 正确
Time:3 ms
Memory:2176 kb
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Item {
int weight;
int value;
int limit;
};
int shopping(int N, int W, vector<Item> items) {
vector<int> dp(W + 1, 0);
// 初始化dp数组,表示当前承重下可以获得的最大总价值
for (int i = 0; i < N; i++) {
for (int k = 0; k < items[i].limit; k++) {
// 根据限购数量来遍历
for (int j = W; j >= items[i].weight; j--) {
// 逆序更新dp数组
dp[j] = max(dp[j], dp[j - items[i].weight] + items[i].value);
}
}
}
return dp[W];
}
int main() {
int N, W; cin >> N >> W;
vector<Item> items(N);
for (int i = 0; i < N; i++) {
cin >> items[i].weight >> items[i].value >> items[i].limit;
}
int result = shopping(N, W, items);
cout << result << endl; return 0;
}
2、代码截图(VisualStudio2022)
3、用户界面(控制台):
1)Microsoft Visual Studio 2022
参数
基本思想:
动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解
在这个题目中:小华需要在承重和单个商品限购数的条件下购买尽可能高总价值的商品。
1)使用一个结构体Item来表示每种商品的重量、价值和限购数量。
2)定义shopping函数来实现动态规划算法,计算小华可以获得的最大总价值。
3)在主函数中,读取输入数据包括商品数量N、承重W以及每种商品的重量、价值和限购数量。
4)调用shopping函数,并输出小华可以获得的最大总价值。
这个题目的关键在于利用动态规划的思想,在受限购数约束的情况下,通过遍历每种商品及其限购数量,动态更新当前承重下可以获得的最大总价值。最终返回小华可以获得的最大总价值。
优点:
能够得到全局最优解;可以得到一族最优解;由于动态规划方法反映了动态过程演变的联系和特征,在计算时可以利用实际知识和经验提高求解效率。
缺点:
没有统一的标准模型;
4)运行控制台
1)问题描述:
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例输入输出:
数据要求:
2)解决思路:
定义一个coinChange
函数来计算最少的硬币数量。然后在main
函数中给定了输入数组和金额,并打印出最小的硬币数量。
3)代码:(C++,VisualStudio 2022 community Manegement)
4)方案检查:
coins=[1,2,5],amount=11,输出:3;
coins=[2],amount=3,输出:-1;
coins=[1],amount=0;输出:0
通过这样的动态规划算法实现,我们能够有效地找到凑成总金额所需的最少硬币个数。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuoyibo.net 版权所有 湘ICP备2023021910号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务