问题描述:
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
测试:
输入:
3 5
3 5
2 10
2 20
输出:
40
这里先说一下fill的用法吧,它的头文件是<algorithm>,可以给一个数组赋同一值
// fill(f[0],f[0]+(N+1)*(V+1),maxx);//fill给二维数组赋值 // fill(f,f+V+1,maxx);//fill给一维数组赋值
用二维数组写的完全背包
//N代表数量,V代表背包的容量 //c[i]代表第i个的价值,w[i]代表第i个的体积 int f[N+1][V+1]; fill(f[0],f[0]+(N+1)*(V+1),N);//fill给二维数组赋值 for(int i=0;i<=N;i++){ f[i][0]=0; } for(int i=0;i<=V;i++){ f[0][i]=0; } for(int i=1;i<=N;i++){ for(int j=0;j<=V;j++){ if(j>=w[i]){ f[i][j]=max(f[i][j-w[i]]+c[i],f[i-1][j]);//选完之后还可以再选 } else{ f[i][j]=f[i-1][j];//这个不符合就不要在考虑了 } } }
一维数组优化版
//N代表数量,V代表背包的容量 //c[i]代表第i个的价值,w[i]代表第i个的体积 int f[V+1]; fill(f,f+V+1,N); f[1]=0; for(int i=1;i<=N;i++){ for(int j=w[i];j<=V;j++){ if(j>=w[i]){ f[j]=max(f[j-w[i]]+c[i],f[j]);//选完之后还可以再选 } } }
这个就是完全背包的模板了
最后把整个代码给出
#include<iostream> #include<algorithm> const int N=-1e9+3; using namespace std; int main() { int N,V; cin >> N >> V; int w[N+1]={0,0};//重量 int c[N+1]={0,0};//价值 for(int i=1;i<=N;i++){ cin >> w[i] >> c[i]; } //N代表数量,V代表背包的容量 //c[i]代表第i个的价值,w[i]代表第i个的体积 int f[V+1]; fill(f,f+V+1,N); f[1]=0; for(int i=1;i<=N;i++){ for(int j=w[i];j<=V;j++){ if(j>=w[i]){ f[j]=max(f[j-w[i]]+c[i],f[j]);//选完之后还可以再选 } } } cout << f[V]; return 0; }