2.砝码称重 - 蓝桥云课 (lanqiao.cn)
思路
动态规划的核心思想是将问题分解成更小的子问题,并存储子问题的解,以避免重复计算
数组 dp[i][j]
表示使用前 i
个砝码可以称出的重量为 j
的数量
更新过程如下:
1.初始化:dp[0][0] = 0;
2.对于每一个砝码wi:
ac代码
#include<bits/stdc++.h>
typedef long long ll;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
const ll M=2e5+10;
const int N=110;
int dp[N][M]={0};
using namespace std;int main()
{IOS;int n,num=0;cin>>n;int w[N];ll ans=0;for(int i=1;i<=n;i++){cin>>w[i];num+=w[i];}dp[0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=num;j++){dp[i][j] = dp[i-1][j] + dp[i-1][abs(j-w[i])] + dp[i-1][j+w[i]];//cout<<dp[i][j]<<" ";}//cout<<endl;}for(int i=1;i<=num;i++){if(dp[n][i]) ans++;}cout<<ans;return 0;
}