赞
踩
有 N 件物品和一个容量是 V的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。
接下来有 N 行,每行两个整数 vi,wi用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一个整数,表示最大价值。
数据范围
0<N,V≤1000
0<vi,wi≤1000
输入样例
- 4 5
- 1 2
- 2 4
- 3 4
- 4 5
输出样例:
8
1(背包容量) | 2 | 3 | 4 | 5 | |
第一个物品 | 2(物品价值) | 2 | 2 | 2 | 2 |
第二个物品 | 2 | 4 | 6 | 6 | 6 |
第三个物品 | 2 | 4 | 6 | 6 | 8 |
第四个物品 | 2 | 4 | 6 | 6 | 8 |
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<cstdio>
- int s[1010],v1[1010];//s指第i个背包的重量,v指第i个背包的价值
- int x[1010][1010];
- using namespace std;
- int main()
- {
- int n,v;
- scanf("%d %d",&n,&v);
- for(int i=1;i<=n;i++)
- {
- scanf("%d %d",&s[i],&v1[i]);
- }
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=v;j++)
- {
- if(j<s[i])
- {
- x[i][j]=x[i-1][j];
- }
- else
- {
- if(x[i-1][j]>x[i-1][j-s[i]]+v1[i])
- {
- x[i][j]=x[i-1][j];
- }
- else
- {
- x[i][j]=x[i-1][j-s[i]]+v1[i];
- }
- }
- }
- }
- printf("%d",x[n][v]);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。