sdutoj 1725 最少硬币问题(多重背包)

题目链接:点击这里

在这里插入图片描述

n n 种不同面值的硬币,每种面值的硬币还有相应的数量限制,多重背包问题。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 15, M = 20010;

int a[N], b[N];     // 面值和数量
int f[M];

int main()
{
	int n, m;
	
	scanf("%d", &n);
	for(int i = 0; i < n; i++)  scanf("%d%d", &a[i], &b[i]);
	scanf("%d", &m);
	
	memset(f, 0x3f, sizeof f);
	f[0] = 0;
	
	for (int i = 0; i < n; i++)             // 枚举物品
	{
	    for (int j = m; j >= a[i]; j--)     // 再逆序枚举体积
	    {
	        for (int k = 0; k <= b[i] && k * a[i] <= j; k++)       // 再枚举决策
	        {
	            f[j] = min(f[j], f[j - k * a[i]] + k);
	        }
	    }
	}
	
    printf("%d\n", f[m] == INF ? -1 : f[m]);
	return 0;
}
发布了844 篇原创文章 · 获赞 135 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/103439908
今日推荐