USACO算法系列二十四——nuggets

     题目:http://www.nocow.cn/index.php/Translate:USACO/nuggets

     这道题目不难吧,但是困恼我半天的是它的边界问题,始终没有找到合适的方法。最后看了参考答案,才把边界给搞清楚了。具体我就不说了,0-1背包问题。

     为什么只要考虑65536 + 256的问题呢?因为如果两个数A,B;如果可以表示所有的数,那么在A,B的最小公倍数里面就会出现,考虑A*B,最大就是256*256…… 这道题告诉我要补充数论的知识。好好努力,还有好多东西要学习。  #include<iostream> #include <fstream> #define LEN 10 #define SIZE 65793 using namespace std; int n; int csize[LEN] = {0}; bool cube[SIZE]; int mini = 257; int result = 1; int main() { ifstream fin("nuggets.in"); ofstream fout("nuggets.out"); //输入数据 fin >> n; for (int i=0; i < n; i ++) { fin >> csize[i]; if (csize[i] < mini) { mini = csize[i]; } } //所有情况都可能 if (mini == 1) { fout << 0 << endl; return 0; } //初始化数据 cube[0] = true; for (int i=1; i < SIZE; i ++ ) { cube[i] = false; } //计算 for (int i=0; i < n; i ++) { for (int j=csize[i]; j < SIZE; j ++) { if (cube[j] == false) { if (cube[j - csize[i]]) { cube[j] = true; }//end if }//end if cube[j] }//end for j }//end for i for (int i=1; i < SIZE; i ++) { if (!cube[i]) { result = i; } } if (result > 65536) { fout << 0 << endl; } else fout << result << endl; return 0; }

    运行结果:

Executing... Test 1: TEST OK [0.011 secs, 3076 KB] Test 2: TEST OK [0.022 secs, 3076 KB] Test 3: TEST OK [0.022 secs, 3076 KB] Test 4: TEST OK [0.011 secs, 3076 KB] Test 5: TEST OK [0.011 secs, 3076 KB] Test 6: TEST OK [0.011 secs, 3076 KB] Test 7: TEST OK [0.000 secs, 3076 KB] All tests OK.

   思路比较乱。

你可能感兴趣的:(USACO算法系列二十四——nuggets)