算法导论 · 动态规划 · 01背包问题

  • 源代码
#include <cstdio>
#include <cstring> 
#include <vector>
using namespace std;

#define maxn 101
#define maxm 1001
#define maxK(a, b) (a) > (b) ? (a) : (b)

struct node {
	int weight, value;
	node(int w, int v) {
		weight = w;
		value = v;
	}
};

vector<node> vt[maxn];
int n, m, w, v; //n表示物体数量,m表示背包承重量 
int k[maxn][maxm]; 

int main() {
	freopen("6.knapsack.txt", "r", stdin);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) {
		scanf("%d%d", &w, &v);
		vt[i].push_back(node(w, v));
	}
	
	memset(k, 0, sizeof(k));
	
	for(int i = 1; i <= n; i++) {
		for(int j = 0; j <= m; j++) {
			int w = vt[i][0].weight;
			if(w > j) k[i][j] = k[i-1][j];
			else k[i][j] = maxK(k[i-1][j], k[i-1][j-w] + vt[i][0].value);
		}
	}
	for(int i = 1; i <= n; i++) {
		printf("(%d, %d, %d)\n", i, vt[i][0].weight, vt[i][0].value);
	}
	
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			printf("%-3d", k[i][j]);
		}
		printf("\n");
	}
	
	printf("%-3d", k[n][m]);
	return 0;
}
  • 输入数据
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
发布了77 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/y_dd6011/article/details/97434062