【DP】

Luogu P2871 手链

题意:

有n件物品和容量为V的背包,输入各物品的重量c[i],价值w[i]。

求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。

题解:

i遍历每个物品,j遍历当前可拿总重量。(一维数组j倒序遍历,否则改变上次的值。)

    若除本次外已拿的最大价值dp[j-ci]加上本次的价值比上次就拿够当前总重的价值大,取当前物品更新最大值;

    否则不取,保持上次最值继续;

#include<iostream>
#include<cstring>
using namespace std;
int n,v,c[3402],w[3402],dp[12880];
int main()
{
    memset(dp,0,sizeof(dp));
    cin>>n>>v;
    for(int i=1;i<=n;i++){cin>>c[i]>>w[i];}
    for(int i=1;i<=n;i++){
        for(int j=v;j>=c[i];j--){
            if(dp[j-c[i]]+w[i]>dp[j])dp[j]=dp[j-c[i]]+w[i];
        }
    }
    cout<<dp[v]<<endl;
}

猜你喜欢

转载自blog.csdn.net/synlhr/article/details/80257943
DP
DP?