背包----Proud merchants

一件物品p,q,v 分别表示物品的价格,钱少于q时就不能买,和物品的价值

n表示物品数量,m表示初始有的钱

问最多能买多少东西


01背包

注意点是,因为有一个q作为限制条件,所以n件物品不是随意选的了,要考虑先后顺序

于是排序,前面选择的物品要让后面选择的物品可以被选 也就是说p1 + q2 > p2 + q1,(选择的余地更大)也就是p1 - q1  > p2 - q2

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#define inf 1000000000
using namespace std;

int n,m;
struct node{
    int p,q,v;
}w[505];
int dp[5005],mon[5005];

bool cmp(node a, node b)
{
    return a.q - a.p < b.q - b.p;
}

int main()
{
    while(scanf("%d%d",&n,&m) != EOF){
        for(int i = 0; i < n; i++){
            scanf("%d%d%d",&w[i].p,&w[i].q,&w[i].v);
            //dp[i] = 0;
            //mon[i] = m;
        }
        for(int i = 0; i <= m; i++){
            //mon[i] = m;
            dp[i] = 0;
        }
        dp[0] = 0;
        sort(w, w + n, cmp);

        for(int i = 0; i < n; i++){
            for(int j = m; j >= w[i].q; j--){
                if(dp[j] < dp[j - w[i].p] + w[i].v){
                    dp[j] = dp[j - w[i].p] + w[i].v;
                    //mon[j] -= w[i].p;
                }
            }
        }

        printf("%d
",dp[m]);
    }
    return 0;
}


原文地址:https://www.cnblogs.com/wyboooo/p/9643460.html