宝石手镯
请大家仔细分析题目,说实话,本题难度不大,大概是普及- 的难度,
废话不多说,一起来看题吧
首先,大家看到题目的第一感受是怎么? 应该觉得这题是背包吧,再看看,
因为贝茜每种宝石只有一块,所以,则就是著名的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\)