描述
有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是Vi,价值是Wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
0<N,V≤1000
0<vi,wi≤1000
输入
第一行两个整数,N, V,用空格隔开,分别表示物品数量和背包容积。
接下来有N行,每行两个整数Vi, Wi用空格隔开,分别表示第i件物品的体积和价值。
输出
输出一个整数,表示最大价值。
输入样例 1
4 5 1 2 2 4 3 4 4 5
输出样例 1
8
题解1:深度优先搜索
#include<bits/stdc++.h>
using namespace std;
int N,V,v[1010],w[1010],a[1010][1010];
int dfs(int id,int vv){
if(a[id][vv]!=0) return a[id][vv];
if(id>N) a[id][vv]=0;
else if(v[id]>vv) a[id][vv]=dfs(id+1,vv);
else a[id][vv]=max(dfs(id+1,vv),dfs(id+1,vv-v[id])+w[id]);
return a[id][vv];
}
int main(){
cin>>N>>V;
for(int i=1;i<=N;i++)cin>>v[i]>>w[i];
cout<<dfs(1,V);
return 0;
}
题解2:动态规划
#include<bits/stdc++.h>
using namespace std;
int dp[1010][1010],N,V,v[1010],w[1010];
int main(){
cin>>N>>V;
for(int i=1;i<=N;i++) cin>>v[i]>>w[i];
for(int i=1;i<=N;i++){
for(int j=1;j<=V;j++){
if(j>=v[i])dp[i][j]=max(dp[i-1][j-v[i]]+w[i],dp[i-1][j]);
else dp[i][j]=dp[i-1][j];
}
}
cout<<dp[N][V];
return 0;
}