专业开发网站公司郑州免费做网站
题目描述
小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。
小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。
输入
第一行包含两个整数,N,V,分别表示研究材料的种类和行李空间
接下来包含 N 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值
输出
输出一个整数,表示最大价值。
样例输入 复制
4 5
1 2
2 4
3 4
4 5
样例输出 复制
10
提示
第一种材料选择五次,可以达到最大值。
数据范围:
1 <= N <= 10000;
1 <= V <= 10000;
1 <= wi, vi <= 10^9.
#include<iostream>
#include<vector>
using namespace std;int n,bagweight; // 种类 空间 void chose(){vector<int>weight(n);vector<int>value(n);for(int i = 0;i <n;i++){cin >> weight[i] >> value[i];}//完全背包:一个物品可以被拿n次,所以,是正序。 拓展:先物品后背包,是组合数,即不允许集合重复。 先背包后物品,是排列数,顺序不一样也算//dp[j]:容量为j的背包,最多可放dp[j]的价值vector<int>dp(bagweight+1);//递推关系:dp[j] = max(dp[j], dp[j-weight[i]] + valu[i]);//初始化;dp[0] = 0;for(int i = 0;i < n;i++){for(int j = weight[i];j <= bagweight;j++){dp[j] = max(dp[j], dp[j-weight[i]] + value[i]);}} cout << dp[bagweight];
}
int main(){cin >> n >> bagweight;chose();return 0;
}