蓝桥杯(砝码称重,C++)

蓝桥杯(砝码称重,C++)_第1张图片

蓝桥杯(砝码称重,C++)_第2张图片 

 思路:

1、用到动态规划思想。

2、用ans[i][j]记录用前i个砝码,能不能称出重量j。

3、详细思路见代码注释,易懂。

#include
#include
using namespace std;
int main()
{
	int n;
	int a[110];//记录每个砝码重量
	int sum = 0;//计算所有砝码总重量
	int ans[110][100005];//abs[i][j]记录用前i个砝码,能不能称出重量j
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		sum += a[i];
	}
	for(int i=1;i<=n;i++)//遍历所有砝码
		for (int j = 1; j <= sum; j++)
		{
			ans[i][j] = ans[i - 1][j];//先继承前i-1个砝码,能不能称出重量j
			if (ans[i][j] == 0)//不能称出,则加入第i个砝码,判断能不能称出重量j
			{
				if (j == a[i]) ans[i][j] = 1;//说明只用第i个就可以称出重量j
				if (ans[i - 1][j + a[i]] == 1) ans[i][j] = 1;//判断第i-1个砝码能不能称出j+a[i]的重量,可以则只要减去第i个砝码质量
				if (ans[i - 1][abs(j - a[i])] == 1) ans[i][j] = 1;//判断第i-1个砝码能不能称出j-a[i]的重量,可以则加上的i个砝码重量
			}
		}
	int ad = 0;
	for (int i = 1; i <= sum; i++)
		if (ans[n][i] == 1) ad++;
	cout << ad;
}

你可能感兴趣的:(蓝桥杯,c++)