最基础的01背包问题,练习模板专用~,可以考虑用滚动一维数组或者不用二维数组做都可以。
Bone Collector----HDU2602
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1001;
struct info{
int p;
int v;
}s[1001];
int dp[maxn];
int n,m;
//滚动数组做法
void solve()
{
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++){
for(int j = m;j >= s[i].v;j--){
dp[j] = max(dp[j],dp[j-s[i].v]+s[i].p);
}
}
cout<<dp[m]<<endl;
}
//基本解法
/*
int dp[maxn][maxn]; //dp转移方程
void solve()
{
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++){
for(int j = 0;j <= m;j++){ //背包容量要从0开始枚举,不然会wa
if(s[i].v > j){
dp[i][j] = dp[i-1][j];
}
else{
dp[i][j] = max(dp[i-1][j],dp[i-1][j-s[i].v]+s[i].p);
}
}
}
printf("%d\n",dp[n][m]);
}
*/
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int t;
cin>>t;
while(t--){
cin>>n>>m;
for(int i = 1;i <= n;i++){
cin>>s[i].p;
}
for(int i = 1;i <= n;i++){
cin>>s[i].v;
}
solve();
}
return 0;
}
Charm Bracelet----POJ3624
滚动数组优化的01背包,必须优化不优化就会MLE。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
struct info{
int w;
int p;
}s[3410];
int dp[13000];
int n,m;
void solve()
{
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i++){
for(int j = m;j >= s[i].w;j--){
dp[j] = max(dp[j],dp[j-s[i].w]+s[i].p);
}
}
cout<<dp[m]<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
while(cin>>n>>m){
for(int i = 1;i <= n;i++){
cin>>s[i].w>>s[i].p;
}
solve();
}
return 0;
}