4 vòng for là đủ rồi, java bạn à
Hỏi thuật toán bài toán tìm tổng số cách đổi tiền có thể được
2 Likes
Hic!!! chắc em còn phải học hỏi nhiều… anyway … bài trên web là done hết rồi
Cảm ơn bác quân đã nhiệt tình chỉ dẫn em đường đi nước bước ạ
1 Like
thử thêm
if (a*m20 + b*m50 + c*m100 + d*m200 + f*m500 > n) break;
Thế thì là nhanh do thuật toán :))
Yep, mình dùng nhiều trick để tối ưu số phép tính nên mới tối ưu được tốc độ như thế, nhưng nói chung đây là kiểu làm trâu bò, không thích hợp với số lớn
1 Like
Share code cho em với nha anh :’( Cùng lớp mà em chưa nghĩ ra cách làm nữa…
viết vậy thì duyệt trâu bao nhiêu loại tiền (mấy vòng for) cũng được nè:
http://rextester.com/WRMQQA93415
cpu time: 0.01 sec
#include <iostream>
#include <algorithm>
#include <vector>
void count(int n, const std::vector<int>& values, int& ways, int& coins, int vid,
int total=0, int coinCount=0)
{
if (vid)
for (; total <= n; total += values[vid], coinCount++)
count(n, values, ways, coins, vid-1, total, coinCount);
else if ((n-total) % values[vid] == 0) //khỏi cần vòng for cuối cùng
{
ways++;
coinCount += (n-total) / values[vid];
coins = coins ? std::min(coins, coinCount) : coinCount;
}
}
int main()
{
std::vector<int> values{2,5,10,20,50};
std::sort(begin(values), end(values));
int n = 1000;
int ways = 0;
int coins = 0;
count(n, values, ways, coins, values.size() - 1);
std::cout << coins << "\n" << ways << "\n";
}
ai copy thầy hỏi giải thích ko biết giải thích thì rớt nhé
4 Likes
Có biến coins kìa bạn.
1 Like