题解 T79222【宝石手镯】

宝石手镯

请大家仔细分析题目,说实话,本题难度不大,大概是普及- 的难度,
废话不多说,一起来看题吧


首先,大家看到题目的第一感受是怎么? 应该觉得这题是背包吧,再看看,
因为贝茜每种宝石只有一块,所以,则就是著名01背包
那问题就简单了,
01背包的状态转移方程以及核心代码:
如下↓↓↓
1.无优化:

\(dp[i][j] = max( dp[i−1][j−w[i]] + c[i ], dp[i][j])\)

for(int i=1; i<=n; i++)
        for(int j=m; j>=c[i]; j--) dp[i][j] = max(dp[i-1][j-c[i]] + w[i] , dp[i][j]) ;

2.一维数组优化

\(dp[j] = max( dp[j−w[i]] + c[i] , dp[j])\)

for(int i=1; i<=n; i++)
    for(int j=m; j>=c[i]; j--) dp[j] = max(dp[j-c[i]] + w[i] , dp[j]) ;

本题中,\(m\)即背包最大容量,\(n\)为物品件数,\(W_i,C_i\)均为物品重量,价值;
得出\(AC\)代码:

#include<bits/stdc++.h>
using namespace std;
int v,n,w[220005],f[220005],c[220005],ans;
int read() //快读(QuickRead)
{
     int x=0,f=1;char ch=getchar();
     while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     return x*f;
}
int main()
{
    n=read();
    v=read();
    for(int i=1;i<=n;i++)
    {
        w[i]=read();
        c[i]=read();
    }
    for(int i=1;i<=n;i++)           
     for(int j=v;j>=w[i];j--)
        f[j]=max(f[j],f[j-w[i]]+c[i]);
    cout<<f[v];
}

其中\(49-51\)为核心代码。
于是,本题就愉快的\(AC\)\(!!!\)

\(QAQ\)

猜你喜欢

转载自www.cnblogs.com/Luke-Skywalker/p/11227601.html