原题链接
题目大意
有
n
n
n个物品,每个物品都有他所需的价钱和重要度,而某个物品的价值就是他所需的钱数
×
\times
×他的重要度,求出给你
m
m
m元钱,你最多可以得到多少的价值。
S
a
m
p
l
e
\mathbf{Sample}
Sample
I
n
p
u
t
\mathbf{Input}
Input
1000 5
800 2
400 5
300 5
400 3
200 2
S a m p l e \mathbf{Sample} Sample O u t p u t \mathbf{Output} Output
3900
H
i
n
t
&
E
x
p
l
a
i
n
\mathbf{Hint\&Explain}
Hint&Explain
取第二件,第四件和第五件物品,所需钱数为400+400+200=1000
,总价值为400*5+400*3+200*2=3900
。
解题思路
从
m
∼
1
m\sim 1
m∼1循环遍历钱数,如果够买某样东西就比较一下价值,即可。
设
d
p
i
dp_i
dpi为用
i
i
i元可以买到的最大价值,
w
i
w_i
wi是
i
i
i物品的价值,
c
i
c_i
ci为
i
i
i物品的重要值,则:
d
p
j
=
{
0
j
=
0
m
a
x
(
d
p
j
,
d
p
j
−
w
i
+
w
i
×
c
i
)
1
≤
i
≤
n
,
w
i
≤
j
≤
m
dp_{j}=\begin{cases} 0&j=0 \\max(dp_{j},dp_{j-w_i}+w_i\times c_i)&1\le i\le n,w_i\le j\le m \end{cases}
dpj={0max(dpj,dpj−wi+wi×ci)j=01≤i≤n,wi≤j≤m
答案就是:
d
p
m
dp_m
dpm
上代码
#include<iostream>
using namespace std;
int n,m;
int w[35],c[35];
int dp[30010];
int main()
{
cin>>m>>n;
for(int i=1; i<=n; i++) cin>>w[i]>>c[i];
for(int i=1; i<=n; i++)
{
for(int j=m; j>=w[i]; j--)
{
dp[j]=std::max(dp[j],dp[j-w[i]]+w[i]*c[i]);
}
}
cout<<dp[m]<<endl;
return 0;
}
完美切题 ∼ \sim ∼