欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

蓝桥 7.11 dp

最编程 2024-07-11 21:03:53
...

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;
}