解题思路:
设dp[i][j]的含义是:在背包承重为j的前提下,从前i种物品中选能够得到的最大价值。 如何计算dp[i][j]呢?我们可以将它划分为以下若干部分: 选0个第i种物品:相当于不选第i种物品,对应dp[i-1][j]; 选一个第i种物品:对应dp[i - 1][j - v[i]] + w[i]; 选两个第i种物品:对应dp[i - 1][j - 2 * v[i]] + 2 * w[i]; ..... 上述过程并不会无限进行下去,因为背包的承重是有限的。设第i种物品最多可以选t个,则t = ⌊j / v[i]⌋, 于是得到递推式dp[i][j] = max(0 <= k <= t)(dp[i - 1][j - k * v[i]] + k * w[i]; 参考文献:https://blog.csdn.net/raelum/article/details/128996521作者:Lareges
注意事项:
参考代码:
#includeusing namespace std; const int N = 1008; int v[N], w[N];//v[i]表示第i个物品的价值,w[i]表示第i个物品的重量; int dp[N][N]; // 创建dp数组; int main() { int n, m; // 物品数量、背包最大承重; cin >> m >> n; for (int i = 1; i >w[i] >> v[i]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { int t = j / w[i]; // t为第i种物品最多能携带的数量; for (int k = 0; k <= t; k++) dp[i][j] = max(dp[i-1][j], dp[i - 1][j - k * w[i]] + k * v[i]); } } cout << "max=" << dp[n][m] << "\n"; return 0; }
0.0分
0 人评分
Tom数 (C语言代码)浏览:2012 |
C语言考试练习题_保留字母 (C语言代码)浏览:686 |
C语言程序设计教程(第三版)课后习题8.1 (C语言代码)浏览:439 |
【回文数(二)】 (C语言代码)浏览:728 |
【密码】 (C语言代码)浏览:333 |
A+B for Input-Output Practice (V) (C++代码)浏览:450 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:553 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:561 |
愚蠢的摄影师 (C++代码)浏览:936 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:509 |