草体にぼ日記

だらだらと

diverta 2019 Programming Contest B-RGB Boxes

diverta 2019 Programming Contest B-RGB Boxes

提出AC

int main()
{
    cout <<setprecision(10);
    int r, g, b, n;
    cin >> r >> g >> b >> n;
    ll ans = 0 ;
    //solve
    for(int i = 0 ; i * r <= n ; i++){//iは、rの箱の数
        for(int j = 0 ; i * r + j * g <= n; j ++){
            int lastB = n - (i * r) - (j * g);
            if(lastB % b == 0 || lastB == 0){
                ans ++ ;
            }
        }
    }
    cout << ans << endl;
}

解法

全探索の基本的な問題(だと思います。)

似たような問題が結構あるよね(お年玉とか?)

ABC085C Otoshidama

まあ数え上げとはちょっと違うけど。

良くある解説っぽい感じですると、

r = g = b = 1;

のとき

for(int i = 0 ; i <= n ; i ++){
    for(int j = 0 ; i + j <= n; j++){
        for(int k = 0 ; i + j + k <= n ;k++){
            if(i + j + k == n){
                ans ++ ;
            }
        }
    }
}

ってやると、(r,g,b) = (0,0,0) から(3000,0,0)までループが回ってしまうので

馬鹿になる。

iとjが求まってれば k は n - ( i+j)で求まるっていうのを

使うね。

でまあ、今回の場合は i , j に重み(箱に入ってる玉の数)をかけて考えればいい