diverta 2019 Programming Contest B-RGB Boxes
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; }
解法
全探索の基本的な問題(だと思います。)
似たような問題が結構あるよね(お年玉とか?)
まあ数え上げとはちょっと違うけど。
良くある解説っぽい感じですると、
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 に重み(箱に入ってる玉の数)をかけて考えればいい