Forrest


私信TA

用户名:dotcpp0717441

访问量:4003

签 名:

等  级
排  名 88
经  验 9136
参赛次数 1
文章发表 121
年  龄 0
在职情况 教师
学  校 优学乐程
专  业

  自我简介:

解题思路:01背包 两个限制条件, 双重循环倒序遍历 f[i][j]表示i个精灵球j伤害值最多收获的精灵
注意事项:得到大值,再找最小的j

参考代码:

#include<iostream>
#include<algorithm> 
using namespace std;
const int N = 1e3 + 10;
int n,m,k,f[N][N],v[N],h[N];
int main()
{
	cin >> n >> m >> k;
	for(int i = 1; i <= k; i ++) cin >> v[i] >> h[i];
	for(int i = 1; i <= k; i ++)
		for(int j = n; j >= v[i]; j --)
			for(int p = m; p >= h[i]; p --)
				f[j][p] = max(f[j][p], f[j - v[i]][p - h[i]]+ 1);
	int ans;
	for(int i = 0; i <= m; i ++) if(f[n][i] == f[n][m]) {
		ans = i;
		break;
	}
	cout << f[n][m] << ' ' << m - ans;
	return 0;
}


 

0.0分

1 人评分

  评论区

  • «
  • »