其他分享
首页 > 其他分享> > 洛谷 P2079 烛光晚餐 背包

洛谷 P2079 烛光晚餐 背包

作者:互联网

题目

题意: 背包容量为V, 有n个物品, 每个物品有a价值, b价值, 和代价, 要使总的a价值不小于0, 在此基础上总的b价值最大.

思路: 背包

dp[j][k]中, j代表当前背包容量, k代表当前a价值是多少(将负的平移到正数范围内,0->500), dp[j][k]表示当前最大b价值.

递推式:dp[j][k]=dp[j-v[i]][k-a[i]]+b[i]

dp顺序: for i: 1 to n,

                 for j: V to 0,

                      for k: 0 to 1005

代码:

#include<bits/stdc++.h>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
typedef long long ll;

const int M=2e5+5;
const int inf=1e9+5;
const int mod=1e9+7;

int dp[505][1005];
//     v     x
int x[505],y[505],c[505];


int main() {
    fill(dp[0],dp[0]+505*1005,-inf);
    int n,V;
    scanf("%d%d",&n,&V);
    for(int i=1; i<=n; i++) {
        scanf("%d%d%d",&c[i],&x[i],&y[i]);
    }
    dp[0][500]=0;//500代表x满足度为0时
    for(int i=1; i<=n; i++) {
        for(int j=V; j>=0; j--) {
            for(int k=0; k<1005; k++) {
                if(k-x[i]>=0
                        &&k-x[i]<1005
                        &&j>=c[i]
                        &&dp[j][k]<dp[j-c[i]][k-x[i]]+y[i]) {
                    dp[j][k]=dp[j-c[i]][k-x[i]]+y[i];
                }
            }
        }
    }
    int ans=0;
    for(int i=0; i<=V; i++) {
        for(int j=500; j<1005; j++) {
            ans=max(ans,dp[i][j]);
        }
    }
    printf("%d\n",ans);
    return 0;
}

 

标签:P2079,洛谷,当前,容量,背包,&&,价值,晚餐,dp
来源: https://blog.csdn.net/qq_32259423/article/details/90046112