解题思路:

感谢地表最强召唤兽提供的代码,题目其实就是多重背包逆推

纵轴表示蛋糕的编号,横轴表示达到的美味度

不过要注意不是所有状态都是可以达到的,这是关键

更新当前一行的状态,然后再选择选或者不选当前蛋糕中较优的一种选择

注意事项:

参考代码:

#include<iostream>
#include<algorithm>
#include<algorithm>
using namespace std;
const int INF = 0x3FFFFFFF;
int maxn = 50;
int yami[50];
int cnt[50];
int sum[50][20010];//纵轴是蛋糕的编号,横轴表示当前美味度
int m, n;
int main(void)
{
	cin >> m >> n;
	for (int i = 0; i<n; i++) 
		cin >> yami[i] >> cnt[i];
	int sumn = 0;//蛋糕总数
	for (int i = 0; i<n; i++) 
		sumn += cnt[i];

	for (int i = 0; i <= sumn; i++)
	{
		for (int j = 0; j <= m; j++) 
			sum[i][j] = INF;
	}
	sum[0][0] = 0;

	int cur = 1;
	for (int i = 0; i<n; i++)
	{
		for (int j = 0; j<cnt[i]; j++)
		{
			for (int k = 0; k <= m; k++)
			{
				//k为可以获得的美味度和,k >= yami[i]表示达到的美味度和大于当前蛋糕的美味度
				//sum[cur - 1][k - yami[i]] != INF表示当前美味度可以由之前的状态达到,关键!
				//sum[cur][k]>sum[cur - 1][k - yami[i]] + 1为选择最优的状态转移条件
				if (k >= yami[i] && sum[cur - 1][k - yami[i]] != INF && sum[cur][k]>sum[cur - 1][k - yami[i]] + 1)
				{
					sum[cur][k] = sum[cur - 1][k - yami[i]] + 1;
				}
			}
			//选择或不选择当前蛋糕可以更优
			for (int k = 0; k <= m; k++)
			{
				sum[cur][k] = min(sum[cur - 1][k], sum[cur][k]);
			}
			cur++;
		}
	}
	if (sum[cur - 1][m] != INF) cout << sum[cur - 1][m];
	else cout << "><";
	return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论