当前位置:   article > 正文

01背包问题_n 件物品和一个容量是 v 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,

n 件物品和一个容量是 v 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,

有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。

第 i 件物品的体积是 vi,价值是 wi。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

输入格式

第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。

接下来有 N 行,每行两个整数 vi,wi用空格隔开,分别表示第 i 件物品的体积和价值。

输出格式

输出一个整数,表示最大价值。

数据范围

0<N,V≤1000
0<vi,wi≤1000

输入样例

  1. 4 5
  2. 1 2
  3. 2 4
  4. 3 4
  5. 4 5

输出样例:

8

公式

 

 1(背包容量)2345
第一个物品2(物品价值)2222
第二个物品24666
第三个物品24668
第四个物品24668

代码

  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. int s[1010],v1[1010];//s指第i个背包的重量,v指第i个背包的价值
  6. int x[1010][1010];
  7. using namespace std;
  8. int main()
  9. {
  10. int n,v;
  11. scanf("%d %d",&n,&v);
  12. for(int i=1;i<=n;i++)
  13. {
  14. scanf("%d %d",&s[i],&v1[i]);
  15. }
  16. for(int i=1;i<=n;i++)
  17. {
  18. for(int j=1;j<=v;j++)
  19. {
  20. if(j<s[i])
  21. {
  22. x[i][j]=x[i-1][j];
  23. }
  24. else
  25. {
  26. if(x[i-1][j]>x[i-1][j-s[i]]+v1[i])
  27. {
  28. x[i][j]=x[i-1][j];
  29. }
  30. else
  31. {
  32. x[i][j]=x[i-1][j-s[i]]+v1[i];
  33. }
  34. }
  35. }
  36. }
  37. printf("%d",x[n][v]);
  38. return 0;
  39. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/401569
推荐阅读
相关标签
  

闽ICP备14008679号