您的位置:首页 > 其它

这次一定要记住 0-1背包

2018-04-03 11:41 260 查看
马上就要校赛了,也不能太水了吧,把学过的再自己打一边

这次一个字的书也不看 - -!

A - Charm Bracelet POJ - 3624

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

int n,W;
int dp[3500][3500];
int w[3500];
int v[3500];

void solve(){
memset(dp,0,sizeof(dp));
for(int i = n-1;i >= 0;i--){
for(int j = 0;j <= W;j++){
if(j < w[i])    dp[i][j] = dp[i+1][j];
else{
dp[i][j] = max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
}
}
}
return;
}

int main(){
scanf("%d %d",&n,&W);
for(int i = 0;i < n;i++){
scanf("%d %d",&w[i],&v[i]);
}
solve();
cout<<dp[0][W]<<endl;;
return 0;
}


然后是逆向的 - -

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

int n,W;
int dp[3500][3500];
int w[3500];
int v[3500];

void solve(){
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++){
for(int j = 0;j <= W;j++){
if(j < w[i])    dp[i+1][j] = dp[i][j];
else dp[i+1][j] = max(dp[i][j],dp[i][j-w[i]]+v[i]);
}

}
return;
}

int main(){
cin>>n>>W;
for(int i = 0;i < n;i++){
scanf("%d %d",&w[i],&v[i]);
}
solve();
cout<<dp
[W]<<endl;;
return 0;
}


推重量

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

int n,W;
int dp[3500][3500];
int w[3500];
int v[3500];

void solve(){
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++){
for(int j = 0;j <= W;j++){
dp[i+1][j] = max(dp[i+1][j],dp[i][j]);
if(j + w[i] <= W)    dp[i+1][j+w[i]] = max(dp[i+1][j+w[i]],dp[i][j]+v[i]);
}
}
return;
}

int main(){
cin>>n>>W;
for(int i = 0;i < n;i++){
scanf("%d %d",&w[i],&v[i]);
}
solve();
cout<<dp
[W];
return 0;
}


一维数组

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;

int n,W;
int dp[3500];
int w[3500];
int v[3500];

void solve(){
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++){
for(int j = W;j >= w[i];j--){
dp[j] = max(dp[j],dp[j - w[i]] + v[i]);
}
}
return;
}

int main(){
scanf("%d %d",&n,&W);
for(int i = 0;i < n;i++){
scanf("%d %d",&w[i],&v[i]);
}
solve();
cout<<dp[W]<<endl;;
return 0;
}


$(".MathJax").remove();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: