#include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <algorithm> #define N 100000//价值范围 #define M 10//重量范围 using namespace std; int w[N] = {0}; int v[N] = {0}; int flag[N] = {0}; int arr[N][N] = {0}; int main() { int n = 0, c = 0, x, y; printf("请输入物品个数和背包容量:(容量尽可能小)"); scanf("%d%d", &n, &c); srand((unsigned)time(NULL)); printf("\n物品重量分别为:\n"); for (int i = 0; i < n; i++) { x = rand() % M + 1; w[i] = x; printf("%6d", w[i]); } printf("\n物品价值分别为:\n"); for (int i = 0; i < n; i++) { x = rand() % N + 1; v[i] = x; printf("%6d", v[i]); } for(int i=1; i<=n; i++) {//物品i for(int j=1; j<=c; j++) {//重量j if(j>=w[i-1]) { arr[i][j] = max(arr[i-1][j], arr[i-1][j-w[i-1]]+v[i-1]); } else { arr[i][j] = arr[i-1][j]; } } } printf("\n最大价值为:\n"); printf("%d ",arr[n][c]); int h = n, g = c; while(h>=1) { if(arr[h][g] == arr[h-1][g]) { flag[h] = 0; } else { flag[h] = 1; g = g - w[h-1]; } h--; } printf("\n放入背包的物品编号为:\n"); for(int i=1; i<=n; i++) { if(flag[i] == 1) { printf("%d ", i); } } return 0; }给出该实验算法思想设计流程
时间: 2024-04-27 12:25:18 浏览: 30
该算法是基于动态规划思想的背包问题求解算法。具体步骤如下:
1. 输入物品个数n和背包容量c。
2. 随机生成n个物品的重量和价值,并将其存储在w[N]和v[N]数组中。
3. 初始化一个二维数组arr[N][N],其中arr[i][j]表示将前i个物品放入容量为j的背包中所能获得的最大价值。
4. 对于第i个物品和容量为j的背包,如果j大于等于该物品的重量w[i-1],则可以选择将该物品放入背包中或者不放入背包中。如果放入背包,则总价值为前i-1个物品放入容量为j-w[i-1]的背包中的最大价值加上该物品的价值v[i-1];如果不放入背包,则总价值为前i-1个物品放入容量为j的背包中的最大价值。取两者中的最大值作为arr[i][j]的值。
5. 最终背包能够装载的最大价值为arr[n][c]。
6. 通过回溯的方式确定哪些物品被放入了背包中。从arr[n][c]开始,向前逐个比较arr[i][j]和arr[i-1][j]的大小,如果相等,则说明第i个物品没有被放入背包中,否则说明第i个物品被放入了背包中。将对应的flag[i]标记为1。
7. 输出被放入背包中的物品编号。
以上就是该算法的设计流程。
相关问题
#include <stdio.h>#include <stdlib.h>#include <iostream>#include <string>#include <vector>#include <cassert>
C++中也有多种方式来找到数组、向量或其他容器中的最大值。这里是一些示例:
1. 对整数数组使用`std::max_element`[^4]:
```cpp
#include <algorithm>
int main() {
int arr[] = {5, 10, 15, 20, 25};
auto it = std::max_element(arr, arr + sizeof(arr) / sizeof(int));
std::cout << "Max value in array: " << *it << '\n'; // 输出最大值
}
```
2. 对向量使用`*std::max_element`[^5]:
```cpp
#include <vector>
std::vector<int> vec = {456, 700, 200};
auto max_val = *std::max_element(vec.begin(), vec.end());
std::cout << "Max value in vector: " << max_val << '\n';
```
3. 对字符串比较通常是通过字符逐个比较,但可以借助`std::lexicographical_compare`[^6]实现:
```cpp
#include <string>
std::string str1 = "hello";
std::string str2 = "world";
if (std::lexicographical_compare(str1.begin(), str1.end(), str2.begin(), str2.end())) {
std::cout << "Max string lexicographically: " << str1 << '\n';
} else {
std::cout << "Max string lexicographically: " << str2 << '\n';
}
```
请注意,对于字符串,这里的"最大"是指字典序上的最大。
#include<math.h> #include<algorithm> #include<time.h> #include<stdlib.h> #include<iostream> #include<string.h> #include<map> #include<list> #include<string> #include<queue> #include<set> #include<vector> #include<stack> #include<limits> #define re register #define iosgo() std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define run(i,n) for (int i = 1; i <= n; i++) #define cin std::cin #define cout std::cout #define ll long long #define endl "\n" using namespace std; typedef pair<int, int>pll; const int N = 2e6 + 10; pll c[N]; int h[150][150]; int x[N], y[N], dp[N], ss[N]; int gcd(int a, int b) { return b ? gcd(b, a % b) : a; } signed main() { string a; cin >> a; string b; cin >> b; if (a[0] == '0' || b[0] == '0') { cout << "0\n"; return 0; } int lena = a.length(); int lenb = b.length(); for (int i = 0; i < lena; i++) { x[i] = a[i] - '0'; } for (int i = 0; i < lenb; i++) { y[i] = b[i] - '0'; } int len = lena + lenb - 1; int r = 0; while (r < lenb) { for (int i = r, j = 0; i < lena + r; i++, j++) { ss[i] += x[j] * y[r]; } r++; } for (int i = len; i > 0; i--) { if (ss[i] >= 10) { ss[i - 1] += ss[i] / 10; ss[i] %= 10; } } for (int i = 0; i < len; i++) { cout << ss[i]; } }
这段代码是一个实现两个大整数相乘的程序。代码首先读取两个大整数a和b,然后将其转换为整型数组x和y。接下来,代码计算两个整数的乘积,并将结果存储在数组ss中。最后,代码将结果输出。
注意,这段代码没有考虑负数的情况,且对于较大的整数可能会导致溢出。如果需要处理更大的整数,可以考虑使用其他大数库或算法来实现。
阅读全文