记忆化搜索 按重量穷竭搜索 按价格穷竭搜索 三种方式
#include<iostream>
#include<cstdio>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAX 110
#define INF 10000000
using namespace std;
int n,W;
int v[MAX];
int w[MAX];
int dp[MAX][MAX];
int Rec(int i, int j){
int res;
if(dp[i][j] >= 0){
return dp[i][j];
}
if(i == n){
res = 0;
}
else if(j < w[i]){
res = Rec(i+1, j);
}
else{
res = max(Rec(i+1,j), Rec(i+1,j-w[i])+v[i]);
}
return dp[i][j] = res;
}
void Solve(){
memset(dp, -1, sizeof(dp));
cout << Rec(0,W) << endl;
}
//测试函数
int main(){
ifstream cin ("D:\\钢铁程序员\\程序数据\\04501背包问题.txt");//从文件读取数据流,省去手动输入的麻烦
if(!cin){//读取如果失败
cout << "ERROR" << endl;
}
cin >> n;
for(int i=0; i<n; i++)
cin >> w[i] >> v[i];
cin >> W;
Solve();
cin.close();//打开文件以后要关闭
return 0;
}
穷竭搜索+剪枝较为方便
#include<iostream>
#include<cstdio>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAX 110
#define INF 10000000
using namespace std;
int N, W;
int dp[MAX][MAX];
int w[MAX], v[MAX];
//测试函数
int main(){
ifstream cin ("D:\\钢铁程序员\\程序数据\\04501背包问题.txt");//从文件读取数据流,省去手动输入的麻烦
if(!cin){//读取如果失败
cout << "ERROR" << endl;
}
cin >> N;
for(int i=0; i<N; i++)
cin >> w[i] >> v[i];
cin >> W;
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]);
}
cout << dp[N][W] << endl;
cin.close();//打开文件以后要关闭
return 0;
}
按价格穷竭搜索 进行了空间优化
#include<iostream>
#include<cstdio>
#include<fstream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAX 110
#define INF 10000000
using namespace std;
int N, W;
int dp[MAX];
int w[MAX], v[MAX];
//测试函数
int main(){
ifstream cin ("D:\\钢铁程序员\\程序数据\\045 01背包问题.txt");//从文件读取数据流,省去手动输入的麻烦
if(!cin){//读取如果失败
cout << "ERROR" << endl;
}
cin >> N;
for(int i=0; i<N; i++)
cin >> w[i] >> v[i];
cin >> W;
for(int i=0; i<N; i++)
for(int j=0; j<=11; j++)
dp[j] = INF;
//穷竭搜索
dp[0] = 0;
for(int i=0; i<N; i++)
for(int j=11; j>=v[i]; j--){
dp[j] = min(dp[j], dp[j-v[i]]+w[i]);
}
//找到合适的重量
int ans = 0;
for(int i=0; i<=11; i++)
if(dp[i] <= W)
ans = max(ans,i);
cout << ans << endl;
cin.close();//打开文件以后要关闭
return 0;
}