用c++写代码。1、<验证> 输入背包容量,物品数量、价值及重量,利用动态规划法解决0-1背包问题,要求输出装入物品的对应指示向量,并分析该算法性能。 2、<探索> 当背包允许物品部分装入时,重新设计动态规划策略,满足背包承载最大时价值最高,输出指示向量,并与问题1结果相比较,同时分析算法性能差异。
时间: 2023-12-31 07:04:31 浏览: 93
好的,让我来回答您的问题:
首先,关于问题1,以下是C++代码示例:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void knapsack(int W, int n, vector<int>& wt, vector<int>& val) {
vector<vector<int>> dp(n+1, vector<int>(W+1, 0));
vector<int> selected(n, 0);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= W; j++) {
if (wt[i-1] > j) {
dp[i][j] = dp[i-1][j];
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-wt[i-1]]+val[i-1]);
}
}
}
int i = n, j = W;
while (i > 0 && j > 0) {
if (dp[i][j] != dp[i-1][j]) {
selected[i-1] = 1;
j -= wt[i-1];
}
i--;
}
cout << "选择的物品编号为:";
for (int i = 0; i < n; i++) {
cout << selected[i] << " ";
}
cout << endl;
cout << "最大价值为:" << dp[n][W] << endl;
}
int main() {
int W, n;
cout << "请输入背包容量和物品数量:";
cin >> W >> n;
vector<int> wt(n), val(n);
cout << "请依次输入物品的价值和重量:" << endl;
for (int i = 0; i < n; i++) {
cin >> val[i] >> wt[i];
}
knapsack(W, n, wt, val);
return 0;
}
```
该算法的时间复杂度为 O(nW),其中n是物品数量,W是背包容量。对于小规模的问题,该算法的表现非常好,但对于大规模的问题,它的性能可能会受到限制。
关于问题2,以下是C++代码示例:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void fractional_knapsack(int W, int n, vector<int>& wt, vector<int>& val) {
vector<pair<double, int>> v(n);
for (int i = 0; i < n; i++) {
v[i] = {1.0 * val[i] / wt[i], i};
}
sort(v.rbegin(), v.rend());
vector<double> selected(n, 0.0);
double cur_w = 0.0, cur_v = 0.0;
for (int i = 0; i < n; i++) {
if (cur_w + wt[v[i].second] <= W) {
cur_w += wt[v[i].second];
cur_v += val[v[i].second];
selected[v[i].second] = 1.0;
} else {
double remain = W - cur_w;
selected[v[i].second] = remain / wt[v[i].second];
cur_w = W;
cur_v += val[v[i].second] * selected[v[i].second];
break;
}
}
cout << "选择的物品编号为:";
for (int i = 0; i < n; i++) {
cout << selected[i] << " ";
}
cout << endl;
cout << "最大价值为:" << cur_v << endl;
}
int main() {
int W, n;
cout << "请输入背包容量和物品数量:";
cin >> W >> n;
vector<int> wt(n), val(n);
cout << "请依次输入物品的价值和重量:" << endl;
for (int i = 0; i < n; i++) {
cin >> val[i] >> wt[i];
}
fractional_knapsack(W, n, wt, val);
return 0;
}
```
该算法的时间复杂度为 O(nlogn),其中n是物品数量。相较于0-1背包问题,它的时间复杂度更低,但是需要对物品进行排序,因此在实际应用中,可能会受到一些限制。
阅读全文