例题:SDNUOJ:1033采药:http://www.acmicpc.sdnu.edu.cn/problem/show/1033

方法一:用一维数组实现:

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
int a[1005];
int main()
{
    int t,n;
    cin >> t >> n;
    for (int i=1;i<=n;i++) //个数
    {
        int x,y; //采药时间、这个药的价值
        cin >> x >> y;
        for (int j=t;j>=x;j--) //一定是从最高向最低进行更新
        {
            a[j]=max(a[j],a[j-x]+y);
        }
    }
    cout << a[t] << endl;
    return 0;
}

方法二:用二维数组实现:
a[i][j]表示从i个物品里面选出不大于j重量的最大价值

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
int a[1005][1005];
int main()
{
    int t,n;
    cin >> t >> n;
    for (int i=1;i<=n;i++) //个数
    {
        int x,y; //采药时间+这个药的价值
        cin >> x >> y;
        for (int j=1;j<=t;j++)
        {
            if(j<x) a[i][j]=a[i-1][j];
            else a[i][j]=max(a[i-1][j],a[i-1][j-x]+y);  //最主要的转换公式
        }
    }
    cout << a[n][t] << endl;
    return 0;
}

例题:Luogu 2925 干草出售
体积和价值一样,直接套用前面的一维数组实现方法就可以了。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
int a[50005];
int main()
{
    int t,n;
    cin >> t >> n;
    for (int i=1;i<=n;i++) //个数
    {
        int x;
        cin >> x;
        for (int j=t;j>=x;j--)
        {
            a[j]=max(a[j],a[j-x]+x);
        }
    }
    cout << a[t] << endl;
    return 0;
}