题目链接:http://acm.uestc.edu.cn/#/problem/show/1606
解法:
算法复杂度:O(N*K)
memset(dp,-1,sizeof(dp));
dp[0]=0;
饮用水:完全背包
for(j=b;j<=k;j++)
if (dp[j-b]!=-1) dp[j]=max(dp[j],dp[j-b]+a);
苏打水:01背包
for(j=k;j>=b;j–)
if (dp[j-b]!=-1) dp[j]=max(dp[j],dp[j-b]+a);

#include <bits/stdc++.h>
using namespace std;
const int maxn = 40010;
int n, k;
int dp[maxn], t[maxn], a[maxn], b[maxn];
int main()
{
    scanf("%d %d", &n, &k);
    for(int i=1; i<=n; i++){
        scanf("%d %d %d", &t[i],&a[i],&b[i]);
    }
    memset(dp, 0, sizeof(dp));
    for(int i=1; i<=n; i++){
        if(t[i]==1){
            for(int j=0; j<=k; j++){
                if(j-b[i]>=0){
                    dp[j]=max(dp[j],dp[j-b[i]]+a[i]);
                }
            }
        }
        else{
            for(int j=k; j>=0; j--){
                if(j-b[i]>=0){
                    dp[j]=max(dp[j], dp[j-b[i]]+a[i]);
                }
            }
        }
    }
    printf("%d\n", dp[k]);
    return 0;
}