簡單背包問題


設有一個背包可以放入的物品重量為S,現有n件物品,重量分別是w1,w2,w3,…wn。 

問能否從這n件物品中選擇若干件放入背包中,使得放入的重量之和正好為S。 

如果有滿足條件的選擇,則此背包有解,否則此背包問題無解。

 

輸入

輸入數據有多行,包括放入的物品重量為s,物品的件數n,以及每件物品的重量(輸入數據均為正整數)

多組測試數據。

輸出

對於每個測試實例,若滿足條件則輸出“YES”,若不滿足則輸出“NO“

樣例輸入

20 5
1 3 5 7 9

樣例輸出

YES
#include <stdio.h>

int g_value[1000];

int packet(int weight, int mount)
{
if (weight == 0)  //背包問題有解
{
return 1;  
}
if (weight < 0 || (weight > 0 && mount < 1))  //此背包集合不符合條件
{
return 0;
}
if (packet(weight - g_value[mount - 1], mount - 1))  //判斷是否 weight[mount - 1]是否包含在最后的背包集合中
{
return 1;    //
}
else
{
return packet(weight, mount - 1);  //不在
}
}
int main()
{
int weight, mount, i;
while(EOF != scanf("%d%d", &weight, &mount))
{
for (i = 0; i < mount; i++)
{
scanf("%d", &g_value[i]);
}
if (packet(weight, mount))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM