Aşağıdaki sorun bildirimini göz önünde bulundurun:
İlk sayı verildiğinde, siz ve arkadaşınız mükemmel bir kareyi çıkarmak için sırayla ilerlersiniz. Sıfıra ilk giren kazanır. Örneğin:
Başlangıç Durumu: 37
Oyuncu1 çıkartma 16. Durum: 21
Oyuncu2 çıkartma 8. Durum: 13
Oyuncu1 çıkartma 4. Durum: 9
Oyuncu2 çıkartma 9. Durum: 0
Oyuncu2 kazandı!
Başlangıç durumu veren, en uygun hamleyi veren bir program yazın, yani oyunu kazanmayı garantileyen bir program. Eğer olası bir hamle sizi kazanan bir duruma getiremezse, -1'e dönün.
Bu problem, dinamik programlama kullanılarak yalancı polinom zamanda çözülebilir . Fikir, n ( başlangıç durumudur) n uzunluğunda bir diziyi en uygun hareketlerle aşağıdan yukarıya veya hiçbir hareket kazanmaya yol açmıyorsa -1 ile doldurmaktır . Bu O (n * sqrt (n)) alacaktır, çünkü her sayı için mümkün olan her mükemmel kareyi ondan daha küçük çıkarmayı düşünmeliyiz (bunlardan ~ sqrt (n) vardır). Ancak bu, sözde-polinom çalışma zamanı karmaşıklığıdır, çünkü çalışma zamanı aslında ikili sayıdaki girdinin boyutuyla (sayıyı temsil etmek için kullanılan bit sayısı) ilişkili olarak üstel olarak ölçeklenir.
Herkes bu sorunu çözmek için bir polinom algoritması düşünebilir mi? Değilse, NP-Complete olabilir mi? Neden?