网站定制开发需要什么资质,wordpress 点赞 ajax,东西湖区网站建设公司,如何做餐饮的网站文章目录 3. 完全背包问题题目描述动态规划一维数组 3. 完全背包问题
题目描述
有 N种物品和一个容量是 V的背包#xff0c;每种物品都有无限件可用。
第 i 种物品的体积是 vi#xff0c;价值是 wi。
求解将哪些物品装入背包#xff0c;可使这些物品的总体积不超过背包容… 文章目录 3. 完全背包问题题目描述动态规划一维数组 3. 完全背包问题
题目描述
有 N种物品和一个容量是 V的背包每种物品都有无限件可用。
第 i 种物品的体积是 vi价值是 wi。
求解将哪些物品装入背包可使这些物品的总体积不超过背包容量且总价值最大。 输出最大价值。
输入格式 第一行两个整数NV用空格隔开分别表示物品种数和背包容积。
接下来有 N 行每行两个整数 vi,wi用空格隔开分别表示第 i 种物品的体积和价值。
输出格式 输出一个整数表示最大价值。
数据范围 0N,V≤1000
0vi,wi≤1000 输入样例
4 5
1 2
2 4
3 4
4 5输出样例
10动态规划
一维数组
这段代码演示了如何解决一个经典的动态规划问题即完全背包问题。注释已经添加在代码的相应部分以便详细解释每一步。
#includebits/stdc.h // 引入所有标准库
using namespace std;int main()
{int n,v; // n 表示物品种数v 表示背包容量cinnv; // 输入物品种数和背包容量vectorint val(n1,0),w(n1,0); // val 存放物品价值w 存放物品体积vectorint dp(v1,0); // dp 数组用于存放每个容量下的最大价值for(int i0;in;i)cinw[i]val[i]; // 输入每种物品的体积和价值// 动态规划过程for(int i0;in;i) // 遍历所有物品{// 完全背包的特点是每种物品可以选无限次所以内循环正序遍历for(int jw[i];jv;j) // 对于每个容量从当前物品的体积开始遍历到背包容量{// 状态转移方程尝试将当前物品加入背包并更新最大价值dp[j]max(dp[j],dp[j-w[i]]val[i]);}}// 输出最大价值即背包容量为v时的最大价值coutdp[v];return 0;
}在这个代码中dp[j] 表示的是背包容量为j的情况下能够装入物品的最大价值。在内循环中我们尝试将每件物品加入背包中并更新dp[j]为当前dp[j]与dp[j-w[i]]val[i]中的较大值其中dp[j-w[i]]val[i]代表在背包中已经装有一定体积物品的情况下再加入当前考虑的物品所能达到的价值。
完全背包问题与0-1背包问题的重要区别在于完全背包问题中的每种物品可以选取无限次而0-1背包问题中每种物品只能选取一次。