背包问题-简单的0-1背包

发布时间 2023-04-04 13:30:42作者: 刘海烽
/*

#include <iostream>
#include <vector>
using namespace std;
#define max(N1,N2) N1>N2?N1:N2
int main()
{
    /*
    第一行输入背包容量V和物体的个数n
    接下来有n行,每行包含两个数字,分别为该物体的花费和价值
    */
    vector<int> w, v;//w为花费,v为价值
    vector<int> f;//f状态矩阵
    int V, n;//V背包容量,n物体数
    while (cin >> V >> n)
    {
        w.clear();
        v.clear();
        f.clear();
        w.push_back(0);
        v.push_back(0);

        //输入原始数据
        for (int i = 1; i <= n; i++)
        {
            int cur_w, cur_v;
            cin >> cur_w >> cur_v;
            w.push_back(cur_w);
            v.push_back(cur_v);
        }

        //初始化状态矩阵
        f = vector<int>(V + 1, 0);

        //动态规划过程
        for (int i = 1; i <= n; i++)
        {
            for (int j = V; j >= w[i]; j--)
            {
                f[j] = max(f[j], f[j - w[i]] + v[i]);
            }
        }

        //输出答案
        int ans = f[V];
        cout << ans << endl;
    }
    return 0;
}