时间限制 : 1 秒
内存限制 : 128 MB
有一个背包能装的重量 maxw (正整数,0≤maxw≤20000),同时有 n 件物品(1≤n≤100),每件物品有一个重量 w_i(正整数)和一个价值 p_i(正整数)。要求从这 n 件物品中任取若干件装入背包内,使背包的物品价值最大。
输入
第 1 行:背包最大载重 maxw,物品总数 n ;
第 2 行到第 n+1 行:每个物品的重量和价值;
输出
一个数字即背包内物品最大价值;
样例
输入
10 3
4 5
3 4
6 9
输出
14
来源
动态规划 背包问题
代码
cpp
#include<bits/stdc++.h>
using namespace std;
int v,n;
int w[105],p[105];
int dp[105][20005];
int main()
{
cin>>v>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i]>>p[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=v;j++)
{
if(w[i]<=j)
{
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+p[i]);
}
else
{
dp[i][j]=dp[i-1][j];
}
}
}
cout<<dp[n][v];
return 0;
}
优化后:
cpp
#include<bits/stdc++.h>
using namespace std;
int v,n;
int w[105],p[105];
int dp[20005];
int main()
{
cin>>v>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i]>>p[i];
}
for(int i=1;i<=n;i++)
{
for(int j=v;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+p[i]);
}
}
cout<<dp[v];
return 0;
}