题解 | #【模板】完全背包#
【模板】完全背包
https://www.nowcoder.com/practice/237ae40ea1e84d8980c1d5666d1c53bc
//和10背包差不多,多加一个循环,即把某物品选取k次
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N, V;
cin>>N>>V;
int vi,wi;
vector<int> vs,ws;
for(int i=0;i<N;++i){
cin>>vi>>wi;
vs.push_back(vi);
ws.push_back(wi);
}
vector<int> dp1(V+1,0);
int inf = 1e+6;
vector<int> dp2(V+1,-inf);
dp2[0] = 0;
for(int i=0;i<N;++i){
int v = vs[i];
int w = ws[i];
for(int j=0;j+v<=V;++j){
for(int k=0;j+k*v<=V;++k){
dp1[j+k*v] = max(dp1[j+k*v],dp1[j]+k*w);
dp2[j+k*v] = max(dp2[j+k*v],dp2[j]+k*w);
}
}
}
cout<<dp1[V]<<endl;
if(dp2[V]<0)dp2[V]=0;
cout<<dp2[V];
return 0;
}
// 64 位输出请用 printf("%lld")

查看18道真题和解析