LQ0033 砝码称重DP
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0033 砝码称重DP相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2021初赛 C++ A组F题
题目描述
你有一架天平和N 个砝码,这N 个砝码重量依次是W1, W2, … , WN。
请你计算一共可以称出多少种不同的重量?
注意砝码可以放在天平两边。
输入格式
输入的第一行包含一个整数N。
第二行包含N 个整数:W1, W2, W3, … , WN。
对于50% 的评测用例,1 ≤ N ≤ 15。
对于所有评测用例,1 ≤ N ≤ 100,N 个砝码总重不超过100000。
输出格式
输出一个整数代表答案。
输入样例
3
1 4 6
输出样例
10
问题分析
DP问题,不解释。
AC的C语言程序如下:
/* LQ0033 砝码称重 */
#include <stdio.h>
#include <stdlib.h>
#define N 100 + 1
#define M 100000 + 1
int w[N];
char dp[N][M];
int main()
int n, sum = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", &w[i]);
sum += w[i];
dp[0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= sum; j++)
dp[i][j] = dp[i - 1][j] || dp[i - 1][j + w[i]] || dp[i - 1][abs(j - w[i])];
int cnt = 0;
for (int i = 1; i <= sum; i++)
if (dp[n][i]) cnt++;
printf("%d\\n", cnt);
return 0;
以上是关于LQ0033 砝码称重DP的主要内容,如果未能解决你的问题,请参考以下文章