动态规划-完全背包

//核心代码
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;
}

用二维数组的话,只过了两组数据,其他的都超时了。可能是代码不太对,还是自己太菜了。晚上再改一下代码,看看能不能过数据。

猜你喜欢

转载自blog.csdn.net/jh__chen/article/details/88353222