算法导论 · 蛮力法 · 背包问题

  • 算法说明
    蛮力法求解背包问题,求解出只放[1…n]件物品时的最大价值,对于每种放不同个数的物品,用排列组合来确定放那几个物品,总之构造向量解。
  • 源代码
#include <cstdio>
#include <algorithm>
using namespace std;

#define n 4
#define max(a, b) (a) > (b) ? (a) : (b)

struct it {
	int w, v;
}; 

it goods[n + 1];

int main() {
	//input 
	freopen("knapsack.txt", "r", stdin);
	int W; //背包容量 
	scanf("%d", &W);
	for(int i = 0; i < n; i++) { //n个物品的重量和价值 
		scanf("%d%d", &goods[i].w, &goods[i].v);
	}
	
	//process 
	int a[n][n] = { //每种情况的向量解
		{0, 0, 0, 1},
		{0, 0, 1, 1},
		{0, 1, 1, 1},
		{1, 1, 1, 1}
	};
	int maxv = -1;
	for(int i = 0; i < n; i++) {
		do {
//			for(int j = 0; j < n; j++) {
//				printf("%d ", a[i][j]);
//			}
//			printf("\n");
			int weight = 0, value = 0;
			for(int j = 0; j < n; j++) {
				if(a[i][j] == 1) {
					weight += goods[j].w;
					value += goods[j].v;
				}
			}
			if(weight <= W) maxv = max(maxv, value);
		} while(next_permutation(a[i], a[i] + n)); //排列组合 
	}
	
	//output
	printf("%d", maxv);
	return 0;
}
  • 运行结果
    在这里插入图片描述
发布了77 篇原创文章 · 获赞 40 · 访问量 2万+

猜你喜欢

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