通过三天的发文章,终于稍微弄明白MarkdownMarkdownMarkdown了,接下来话不多说,直接干正事。
前两篇文章分别和大家讲了一下01背包的两种做法,感兴趣的可以去看看。
今天和大家分享一下完全背包问题的解题思路(二维数组)。
本文在写完全背包的解题方法时会与01背包做对比
题目如下:
【题目描述】
设有nnn种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为MMM,今从nnn种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于MMM,而价值的和为最大。
【输入】
第一行:两个整数,MMM(背包容量,M≤200M\le200M≤200)和N(物品数量,N≤30N\le30N≤30);
第2…N+1行:每行二个整数Wi,CiW_i,C_iWi,Ci,表示每个物品的重量和价值。
【输出】
仅一行,一个数,表示最大总价值。
【输入样例】
10 4
2 1
3 3
4 5
7 9
【输出样例】
max=12
题目分析
【算法分析】
这道题和01背包差不多,只不过每种物品的数量变成了无限个,所以依然用动态规划算法求解。
【数据存储】
和01背包一样,m和n都是用两个变量储存即可,每个物品还是有两个值需储存,所以依然要用结构体。
【dp数组含义】
我们知道,01背包时dp[i][j]指的是第i件物品装在背包容量为j的背包里时的最大价值,那其实完全背包中dp数组的含义是 差不多的