背包问题
每个物品能拿一个或一部分,因为初始重量要递增有序,所以不会出现不拿的情况。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n = 3; // n为物品个数
int i, j, m; // m为背包容量
float x[100] = {0}; // 路径数组(用来记录最优解)(初始化为0)
float weight[] = {0, 10, 20, 30}; // 物品重量数组
float value[] = {0, 60, 100, 120}; // 物品价值数组(算法开始前已经按单位价值 从大到小排好序)
cout << "请输入背包容量:";
cin >> m;
for (i = 1; i <= n; i++) //物品整件被装下,x[i]=1
{
if (weight[i] > m)
{
break;
}
x[i] = 1;
m -= weight[i];
}
if (i <= n)
{
x[i] = m / weight[i]; //物品i只有部分被装下,切割
}
cout << "选择装下的物品比例如下:" << endl;
for (int i = 1; i <= n; i++)
{
cout << "[" << i << "]:" << x[i] << endl;
}
}
0-1背包问题
每个物品只有一个,只有拿或不拿两种情况。不要求重量已经排好序。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 100;
int main()
{
int n, V, i, j;
int f[MAXN];
int weight[MAXN], value[MAXN];
cin >> n >> V;
memset(f, 0, sizeof(f));
memset(weight, 0, sizeof(weight));
memset(value, 0, sizeof(value));
for (int i = 1; i <= n; ++i)
cin >> weight[i] >> value[i];
for (int i = 1; i <= n; ++i)
{
for (int j = V; j >= weight[i]; --j)
{
f[j] = max(f[j], f[j - weight[i]] + value[i]);
}
}
cout << "最大价值为:" << f[V] << endl;
return 0;
}