背包与0-1背包

91 阅读1分钟

背包问题

每个物品能拿一个或一部分,因为初始重量要递增有序,所以不会出现不拿的情况。

#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;
}