最少硬币问题

不想你离开。 提交于 2020-03-17 12:11:43
#include<iostream>
#include<algorithm>
#define INF 0x3f3f3f3f //0x3f3f3f3f的十进制是1061109567,可以作为无穷大使用而不致出现数据大于无穷大的情形。
using namespace std;
long long dp[100000];
int w[100000], t[100000], m, n;   //w为面值 t为个数 m为凑的钱数 n为硬币的种类数
int main()
{
	memset(dp, INF, sizeof(dp));  //全部赋为最大是为了不影响比较。即只需要求最小的即可
	dp[0] = 0;					  //与max中的全部赋为0一样。即只需要求最大的即可
	cin >> n;                                                        
	for (int i = 1; i <= n; i++)
		cin >> w[i] >> t[i];
	cin >> m;                                            
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= t[i]; j++)
			for (int k = m; k >= w[i]; k--)
				dp[k] = min(dp[k], dp[k - w[i]] + 1);
	cout << dp[m] << endl;
	return 0;
}




标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!