涓轟簡姝g‘鎻忚堪闂鐨勭姸鎬侊紝蹇呴』浜嬪厛鎺掑簭浠峰兼暟緇勶紝鍥犱負鎺掑簭涔嬪悗鍙互淇濊瘉涓嶈兘涔板綋鍓嶇墿鍝佺殑鏃跺欎竴瀹氫笉鑳戒拱鍓嶉潰鐨勭墿鍝侊紝
閭d箞鎴戜滑瀵瑰墠闈㈢墿鍝佺殑澶勭悊灝辨槸姝g‘鐨勪簡銆?/strong>鑷蟲鍙互榪涜鏈綆鍗曠殑瀛愰棶棰樺垎瑙d簡銆傚埌鏈鍚庣墿鍝佸鐞嗗畬涔嬪悗錛堢墿鍝佹暟涓?錛夛紝濡傛灉閽?br />涓鐐歸兘娌″噺灝戯紝閭d箞(0, M) = 0錛屽惁鍒?0, M) = 1銆傛敞鎰忚繖涓竟鐣屽鐞嗭紝鍚﹀垯浼歸a銆?br /> 鎵浠ワ紝闇瑕佸厛瀵逛環鍊兼暟緇勬帓搴忥紝騫惰綆楀嚭琛ㄧず鍓峃涓墿鍝佷環鍊煎拰鐨勬暟緇勩?br /> 鍋氫笉鍑烘潵鐨勬椂鍊欙紝緲諱簡涓嬪埆浜虹殑瑙f硶錛屼竴澶撮浘姘淬傜湅鏉ヨ繕鏄畻娉曞璁虹殑鎬濇兂鎸囧鎰忎箟澶у浜嗐傘傘?br />
浠g爜濡備笅錛?br />#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef long long INT;
INT nAns[40][1010];
INT nValue[100];
INT nSum[100];
INT nN, nM;
INT GetAns(INT nNum, INT nMoney)
{
if (nAns[nNum][nMoney] == -1)
{
if (nNum == 0)
{
nAns[nNum][nMoney] = 1;
if (nMoney == nM)
{
nAns[nNum][nMoney] = 0;
}
}
else
{
INT nRet = 0;
if (nMoney - nSum[nNum - 1] >= nValue[nNum])
{
nRet = GetAns(nNum - 1, nMoney - nValue[nNum]);
}
else
{
if (nMoney >= nValue[nNum])
{
nRet += GetAns(nNum - 1, nMoney - nValue[nNum]);
}
nRet += GetAns(nNum - 1, nMoney);
}
nAns[nNum][nMoney] = nRet;
}
}
return nAns[nNum][nMoney];
}
int main()
{
INT nT;
scanf("%I64d", &nT);
for (INT i = 1; i <= nT; ++i)
{
scanf("%I64d%I64d", &nN, &nM);
for (INT j = 1; j <= nN; ++j)
{
scanf("%I64d", &nValue[j]);
}
memset(nAns, -1, sizeof(nAns));
sort(nValue + 1, nValue + nN + 1);
nSum[0] = 0;
for (INT j = 1; j <= nN; ++j)
{
nSum[j] = nSum[j - 1] + nValue[j];
}
printf("%I64d %I64d\n", i, GetAns(nN, nM));
}
return 0;
}

]]>