寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #Volume23 : 2333 - My friends are small

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題 "My friends are small"
https://onlinejudge.u-aizu.ac.jp/problems/2333
・僕の友達は小さい
僕が作成、提出したコードは、以下のとおりです。

Aizu Online Judge in C++ #Volume23 : 2333 - My friends are small
/*
Aizu Online Judge in C++ #Volume23 : 2333 - My friends are small
https://onlinejudge.u-aizu.ac.jp/problems/2333
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll n,w,dp[11111],a[222],sum,ans;
int main(void){
    cin>>n>>w;
    for(ll i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    for(ll i=0;i<n;i++){
        memset(dp,0,sizeof(dp));
        if(sum>w){
            break;
        }
        dp[sum]=1;
        for(ll j=i+1;j<n;j++){
            for(ll k=w;k>=sum+a[j];k--){
                (dp[k]+=dp[k-a[j]])%=1000000007;
            }
        }
        for(ll j=sum;j<=w;j++){
            if(j+a[i]>w){
                (ans+=dp[j])%=1000000007;
            }
        }
        sum+=a[i];
    }
    if(sum<=w){
        ans++;
    }
    cout<<ans<<endl;
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/