题解 | #【模板】完全背包#
【模板】完全背包
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")