#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 17:25:24 浏览: 75
include.zip
这是一个经典的背包问题,可以用动态规划的思想来解决。具体的算法流程如下:
1. 输入物品个数n和背包容量c;
2. 随机生成n个物品的重量和价值,并输出;
3. 初始化二维数组arr,arr[i][j]表示前i个物品放入容量为j的背包中的最大价值;
4. 通过以下递推公式计算arr数组:如果j>=w[i-1],则arr[i][j] = max(arr[i-1][j], arr[i-1][j-w[i-1]]+v[i-1]),否则arr[i][j] = arr[i-1][j];
5. 输出最大价值arr[n][c];
6. 根据arr数组反推出放入背包的物品编号,具体方法是从arr[n][c]开始,如果arr[h][g]等于arr[h-1][g],则不放入物品h,否则放入物品h,并将背包容量减去w[h-1],继续处理h-1和g-w[h-1];
7. 输出放入背包的物品编号。
需要注意的是,该算法的时间复杂度为O(nc),当n和c较大时,可能会存在超时的情况。此外,该算法只能处理物品重量和价值为整数的情况,无法处理物品重量和价值为实数的情况。
阅读全文