ในปัญหานี้ เราได้รับค่าสองค่าที่เป็นผลรวม (แสดงถึงผลรวมของหลัก) และหลัก (แสดงถึงจำนวนหลัก) งานของเราคือการหาจำนวนที่น้อยที่สุดด้วยจำนวนหลักและผลรวมของหลักที่กำหนด
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
อินพุต
sum = 15, dgiti = 2
ผลลัพธ์
69
คำอธิบาย
ตัวเลข 2 หลักที่มีผลรวม 15 ได้แก่ 69, 78, 87, 96
แนวทางการแก้ปัญหา
วิธีแก้ปัญหาง่ายๆ คือ พิจารณาตัวเลขทั้งหมดที่มีหลักหน่วยเป็นตัวเลข แล้วหาจำนวนที่น้อยที่สุดที่ผลรวมของหลักเท่ากับผลรวม
วิธีแก้ปัญหาที่มีประสิทธิภาพคือการใช้วิธีโลภ เราจะสร้างตัวเลขโดยเติมองค์ประกอบจากหลักสุดท้าย เช่น LSB ของตัวเลข เราจะพิจารณาองค์ประกอบที่ใหญ่ที่สุดที่เป็นไปได้สำหรับ LSB แล้วจึงไปที่ตำแหน่งถัดไป
เราจะพยายามรักษา LSB ให้ใหญ่ที่สุดและ MSB ให้เล็กที่สุดเท่าที่จะทำได้
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream>
using namespace std;
void findSmallestNumWithSum(int digit, int sum) {
if (sum == 0) {
if(digit == 1)
cout<<"Smallest number is 0";
else
cout<<"Smallest number with sum cannot be found";
return ;
}
if (sum > 9*digit) {
cout<<"Smallest number with sum cannot be found";
return ;
}
int number[digit];
sum -= 1;
for (int i = digit-1; i>0; i--) {
if (sum > 9) {
number[i] = 9;
sum -= 9;
} else {
number[i] = sum;
sum = 0;
}
}
number[0] = sum + 1;
cout<<"Smallest number is ";
for (int i=0; i<digit; i++)
cout<<number[i];
}
int main() {
int sum = 15, digit = 3;
findSmallestNumWithSum(digit, sum);
return 0;
} ผลลัพธ์
Smallest number is 159