01背包
这里就只放自己刷的题目了,毕竟是弱弱哒
HDU2546:饭卡
1 #include <algorithm> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int n,m; 9 while (~scanf("%d", &n), n) 10 { 11 int f[2013] = {0}, menu[2013] = {0}; 12 for (int i = 1; i <= n; ++i){ 13 scanf("%d",&menu[i]); 14 } 15 16 sort(menu + 1, menu + 1 + n); 17 int tmp1 = menu[n]; 18 scanf("%d",&m); 19 if (m < 5){ 20 printf("%d\n",m); 21 continue; 22 } 23 m -= 5; 24 25 for (int i = 1; i < n; ++i){ 26 for (int v = m; v >= menu[i]; --v){ 27 if (f[v] < f[v - menu[i]] + menu[i]){ 28 f[v] = f[v - menu[i]] + menu[i]; 29 } 30 } 31 } 32 printf("%d\n",m + 5 - tmp1 - f[m]); 33 } 34 35 return 0; 36 }
万恶的题目啊!第一道01背包的水题,然后因为sort中的"+ n + 1"写成了"+ n"让我debug了半个钟头有木有!!!!阿西吧!
HDU1171:Big Event in HDU
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 6 using namespace std; 7 8 int value[5007] = {0}, dp[255555] = {0}; 9 10 int main() 11 { 12 int n; 13 while (~scanf("%d",&n), n > 0) 14 { 15 memset(value, 0, sizeof(value)); 16 memset(dp, 0, sizeof(dp)); 17 int step = 0, sum = 0; 18 for (int i = 1; i <= n; ++i){ 19 int v,m; 20 scanf("%d%d", &v, &m); 21 sum += (v * m); 22 while (m--){ 23 value[++step] = v; 24 } 25 } 26 int tmp = sum / 2; 27 28 for (int i = 1; i <= step; ++i){ 29 for (int j = tmp; j >= value[i]; --j){ 30 dp[j] = max(dp[j], dp[j - value[i]] + value[i]); 31 } 32 } 33 printf("%d %d\n",sum - dp[tmp], dp[tmp]); 34 } 35 36 return 0; 37 }
2333,又是各种奇怪的姿势WA了,一开始dp数组没有开大,RE两发,接着判定结束应该是"n > 0" 写成了"n != -1"(=0就会无限下去辣),TLE了一发,然后就更加奇怪了"memset(value, 0, sizeof(value));"写成了"memset(value, 0, sizeof(int));",怒WA一发,然后就过了,真是愉快的小故事啊2333333,碎觉碎觉QAQ
HDU2602:Bone Collector
1 #include <algorithm> 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 6 using namespace std; 7 8 int volume[1007], value[1007] = {0}, dp[4007] = {0}; 9 10 int main() 11 { 12 int T; 13 scanf("%d", &T); 14 while (T--) 15 { 16 memset(value, 0, sizeof(value)); 17 memset(dp, 0, sizeof(dp)); 18 int n,v; 19 scanf("%d%d",&n, &v); 20 for (int i = 1; i <= n; ++i){ 21 scanf("%d", &value[i]); 22 } 23 for (int i = 1; i <= n; ++i){ 24 scanf("%d",&volume[i]); 25 } 26 27 for (int i = 1; i <= n; ++i){ 28 for (int j = v; j >= volume[i]; --j){ 29 dp[j] = max(dp[j], dp[j - volume[i]] + value[i]); 30 } 31 } 32 printf("%d\n",dp[v]); 33 } 34 35 return 0; 36 }
怒WA两发,逗比错误~
浙公网安备 33010602011771号