如何解决背包没有重复
#include <iostream>
#include <vector>
#include <algorithm>
using std::vector;
int o_w(int W,const vector<int> &w) {
vector<int> c(W+1);
for (size_t i = 0; i < w.size(); ++i) {
for(int j = W; j - w[i] >= 0; --j) {
c[j] = std::max(c[j],c[j - w[i]] + w[i]);
}
}
return c[W];
}
int opti_w(int W,const std::vector<int> &w,int n){
std::vector<std::vector<int>> value(n+1,vector<int>(W+1,0));
for(int i=0;i<=n;i++){
for(int j=0;j<=W;j++){
std::cout<<value[i][j]<<" ";
}
std::cout<<"\n";
}
for(int i=1;i<=n;i++){
for(int j=1;j<=W;j++){
//value[j][i]=std::max(value[j][i-1],value[j-w[i]][i-1]+w[i]);
std::cout<<"i:"<<i<<" j:"<<j<<"\n";
std::cout<<"value[i][j]:"<<value[i][j]<<"\n";
std::cout<<"value[i-1][j]:"<<value[i-1][j]<<"\n";
std::cout<<"w[i-1]:"<<w[i-1]<<"\n";
std::cout<<"value[i-1][j-w[i-1]]:"<<value[i-1][j-w[i-1]]<<"\n";
std::cout<<"value[i-1][j-w[i-1]]+w[i-1]:"<<value[i-1][j-w[i-1]]+w[i-1]<<"\n";
value[i][j]=std::max(value[i-1][j],value[i-1][j-w[i-1]] +w[i-1] );
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=W;j++){
std::cout<<value[i][j]<<" ";
}
std::cout<<"\n";
}
return value[n][W];
// return value[W][n];
}
int main() {
int n,W;
std::cin >> W >> n;
vector<int> w(n);
for (int i = 0; i < n; i++) {
std::cin >> w[i];
}
std::cout<<opti_w(W,w,n);
//std::cout << o_w(W,w) << '\n';
}
在opti_w函数中,我以某种方式使用了错误的公式或出现了错误,由于某个时候j- [w-1]变为负数,从而访问了不需要的元素,因此我无法获得正确的值。
o_w函数正确,可用于验证答案。
我该如何解决该问题以及解决方案中的不正确之处。
解决方法
您快到了。为什么不将您的std::max
语句置于if
条件下,以处理j-w[i-1]
毫无意义的情况?
result = signature.apply_async()
result._cache['task_name']
#'procedures.tasks.stop'
我只是更改了if(w [i-1]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。