POJ 1742 Coins(多重背包问题)
发布时间
阅读量:
阅读量
《算法竞赛进阶指南》第281页,多重背包(此处代码参考书中内容)
题意描述:
共有n种硬币,每种硬币的面值为A[i],数量为C[i]。给定一个数值m,要求判断在1到m之间有哪些数值可以被组合出来。
本题关键点:
1、多重背包问题中所采用的“直接拆分法”,
定义布尔型数组f[MaxM];//在处理到第i种硬币时,f[j]用于表示是否能用前i种硬币组合出面值j
在处理状态i(即遍历到第i种硬币时)
for(int k = m; k >= A[i]; --k) //币值 f[k] = f[k] | f[k - A[i]];
{
f[k] |= f[k - A[i]];
}
2、 贪心策略
int used[MaxM]; //在第i个阶段中,used[j]用于表示当f[j]在该阶段为true时,至少需要使用多少枚第i种硬币
在第i个阶段中,若面值j可以被组合出来,即f[j]为true的条件包含以下两种情况:
1、 若原本f[j]就已经为true,则无需进行状态转移操作,并且此时used[j]的值应为0
2、 当f[j]为false时,若面值j - A[i]可以被组合出来(即f[j - A[i]]为true
全部评论 (0)
还没有任何评论哟~
