//核心代码
for(int i = 1;i <= m;i++){
for(int j = v[i];j <= n;j++){ // 完全背包从小到大遍历
f[j] = max(f[j],f[j-v[i]]+w[i]);
// w[i]代表了价值大小 v[i]代表体积大小
}
}
题目:
题目描述
1.每种草药可以无限制地疯狂采摘。
2.药的种类眼花缭乱,采药时间好长好长啊!
输入输出格式
输入格式:
输入第一行有两个整数T(1 <= T <= 100000)和M(1 <= M <= 10000),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到10000之间(包括1和10000)的整数,分别表示采摘某种草药的时间和这种草药的价值。
输出格式:
输出一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。
分析:
#include <iostream>
using namespace std;
#define max(a,b) a>b?a:b
long int t,m;
long int w[100005],v[100005],f[100500];
int main()
{
cin >> t >> m;
for(int i = 1;i <= m;i++){
cin >> v[i] >> w[i] ;
}
for(long int i = 1;i <= m;i++){
for(long int j = v[i];j <= t;j++){
f[j] = max(f[j],f[j-v[i]]+w[i]);
}
}
cout << f[t];
return 0;
}
用二维数组的话,只过了两组数据,其他的都超时了。可能是代码不太对,还是自己太菜了。晚上再改一下代码,看看能不能过数据。