做网站最好要买什么东西,官方网站的资料做证据,家政网站模板下载,开发游戏的公司解决这个问题的关键是使用动态规划的方法。我们可以创建一个二维数组dp[i][j]#xff0c;其中i表示考虑前i件物品#xff0c;j表示背包的容量。dp[i][j]的值表示在考虑前i件物品#xff0c;且背包容量为j时能获得的最大价值。
### 算法步骤 1. 初始化一个二维数组dp#x…
解决这个问题的关键是使用动态规划的方法。我们可以创建一个二维数组dp[i][j]其中i表示考虑前i件物品j表示背包的容量。dp[i][j]的值表示在考虑前i件物品且背包容量为j时能获得的最大价值。
### 算法步骤 1. 初始化一个二维数组dp大小为(N1) x (M1)所有值初始化为0。 2. 遍历每件物品i从1到N。 - 对于每个容量j从0到M。 - 如果当前物品的重量Wi小于等于j则考虑是否选择这件物品。计算不选择这件物品的价值dp[i-1][j]和选择这件物品的价值dp[i-1][j-Wi] Ci取两者的最大值作为dp[i][j]的值。 - 如果Wi大于j则当前物品不能被选择dp[i][j]的值等于dp[i-1][j]。 3. dp[N][M]即为最大总价值。
### 代码实现
#include iostream
#include vector
using namespace std;int main() {int M, N;cin M N;vectorint W(N1), C(N1);vectorvectorint dp(N1, vectorint(M1, 0));for (int i 1; i N; i) {cin W[i] C[i];}for (int i 1; i N; i) {for (int j 0; j M; j) {if (W[i] j) {dp[i][j] max(dp[i-1][j], dp[i-1][j-W[i]] C[i]);} else {dp[i][j] dp[i-1][j];}}}cout dp[N][M] endl;return 0;
}
这段代码首先读取背包容量M和物品数量N然后读取每件物品的重量和价值存储在W和C数组中。接着使用动态规划填充dp数组最后输出dp[N][M]作为最大总价值。