你得到一套金条,你的目标是尽可能多地把金条装进你的包里。每个条形图只有一个副本,对于每个条形图,您可以选择或不接受(因此您不能选择一个条形图的一小部分)。问题描述任务。给定 n 条金条,找出装进一袋容量 W 的最大黄金重量。输入格式。输入的第一行包含一个背包的容量 W 和金条的数量 n。下一行包含 n 个整数 w0,w1,...,wn−1,定义金条的重量。约束。1≤W≤104;1≤n≤300;0 ≤ w0,...,wn−1 ≤ 105。输出格式。输出适合容量为 W 的背包的最大黄金重量。这是我的代码。
#include <bits/stdc++.h>
using namespace std;
int optimal(vector<int>&w,int W,int n){
vector<vector<int> > val(n+2,vector<int>(W+2));
for(int j=0;j<=n;j++)
{
for(int i=0;i<=W;i++)
{ if(i==0 || j==0){ val[j][i]=0;continue;}
if(w[j]<=i)
{
val[j][i]=max(val[j-1][i],(w[j]+val[j-1][i-w[j]]));
//cout<<val[j][i]<<endl;
}
else {val[j][i]=val[j-1][i];
}}
}
int q1=val[n][W];
return q1;
}
int main() {
int n, W;
std::cin >> W >> n;
vector<int> w;
w.push_back(0);
for (int i = 1; i <= n; i++) {
std::cin >> w[i];
}
sort(w.begin(),w.end());
cout<<optimal(w,W,n);
}
我无法弄清楚这个问题的解决方案。非常感谢您在这件事上的任何帮助。TIA。