私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
動的プログラミングの中心的な考え方は、問題をより小さなサブ問題に分解し、計算の繰り返しを避けるためにサブ問題の解を保存することです。
配列dp[i][j]
使用前の意味i
分銅で計量できる重さは、j
量
更新プロセスは次のとおりです。
1. 初期化: dp[0][0] = 0;
2. 各重量について:
- #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;
- }