lanqiao 1447 砝码称重(DP)
This commit is contained in:
38
12lanqiao/test7-3.cpp
Normal file
38
12lanqiao/test7-3.cpp
Normal 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
|
||||||
|
*/
|
||||||
Reference in New Issue
Block a user