题目链接:登录 - 沐枫OJ
二维数组:(代码)
#include<iostream>
using namespace std;
int w[37], c[37]; //w[i]物品的重量,c[i]物品的价值
int dp[37][207]; //dp[i][j]前i件物品放进去之后容量为j的背包的价值
int main() {
int m, n;
cin>>m >>n;
for(int i = 1; i <= n; ++i)
cin>>w[i] >>c[i];
for(int i = 1; i <= n; ++i) {//遍历n个物品
for(int j = 1; j <= m; ++j) { //j为当前背包容量
for(int k = 0; k*w[i] <= j; ++k)
dp[i][j] = max(dp[i][j], dp[i-1][j-k*w[i]] +k*c[i]);
}
}
cout<<"max="<<dp[n][m];
return 0;
}
一维数组:(代码)
//完全背包:一维数组方法
#include <iostream>
int n,m,w[205],v[205],dp[205];
using namespace std;
int main()
{
cin >> m >> n;
for(int i=1;i<=n;i++)
cin >> w[i] >> v[i];
for(int i=1;i<=n;i++) //遍历物品
{
for(int j=w[i];j<=m;j++) //正向遍历背包,用的是新数据
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
}
cout << "max=" << dp[m];
return 0;
}