动态规划——背包系列之砝码称重

本文详细介绍了如何使用C语言实现砝码称重算法,通过输入不同数量的砝码,计算出可以称出的不同重量组合总数。算法涉及动态规划思想,通过二维数组记录并更新可能的重量组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【NOIP1996提高】砝码称重

Description
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),要求
Input
输入方式:a1 a2 a3 a4 a5 a6(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
Output
输出方式:Total=N(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
Sample Input
1 1 0 0 0 0 (注:下划线表示空格)
Sample Output
TOTAL=3 表示可以称出1g,2g,3g三种不同的重量


#include <stdio.h>
#include <stdlib.h>

#define MAXN 1001
#define NUM 6

int main()
{
	int i, j, k, sum, counts[NUM], a[NUM] = {1, 2, 3, 5, 10, 20}, f[NUM+1][MAXN] = {0};
	for (i=0; i<NUM; i++)
		scanf("%d", counts + i);

	for (i=1; i<=NUM; i++)
	{
		for (j=0; j<MAXN; j++)
		{
			if (f[i-1][j] == 1)
			{
				f[i][j] = 1;
			}
			else
			{
				for (k=1; k<=counts[i-1]; k++)
				{
					if (j > k * a[i-1] && f[i-1][j-k*a[i-1]] == 1)
					{
						f[i][j] = 1;
						break;
					}
					else if (j == k*a[i-1])
					{
						f[i][j] = 1;
						break;
					}
				}
			}
		}
	}

	sum = 0;
	for (i=1; i<MAXN; i++)
	{
		if (f[6][i] == 1)
			sum++;
	}

	printf("%d\n", sum);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值