lanqiao 1447 砝码称重(DP)

This commit is contained in:
2025-04-03 11:34:46 +08:00
parent 3e5918b4df
commit 66d4f879a5

38
12lanqiao/test7-3.cpp Normal file
View File

@@ -0,0 +1,38 @@
// lanqiao 1447 砝码称重(DP)
#include<bits/stdc++.h>
using namespace std;
/* 类似于背包DP
状态:dp[i][j]对于前i个砝码能否称出重量为j的情况
状态转移方程:
dp[i][j]=dp[1-1][j]+dp[i-1][j+w[i]]+dp[i-1][abs(j-w[i])]
这个公式包含了三种情况:
1.不使用第i个砝码此时可称重的方案数就是dp[i-1][j]
2.使用了第i个砝码并将其放在天平的一边此时额外增加的可称重方案数dp[i-1][j+w[i]]
3.使用了第i个砝码并将其放在天平的另一边此时额外增加的可称重方案数dp[i-1][abs(j-w[i])]
*/
const int N = 1e2 + 10, M = 1e5 + 10;
int w[N], dp[N][M];
int main(){
int n, sum = 0;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> 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++;
}
cout << cnt << endl;
return 0;
}
/* test samples -> 10
3
1 4 6
*/