非常典型的一道01背包问题,太久没做,写出代码+找BUG花了一个多小时 : )
注意边界 注意边界。
还有小米OJ系统的评判,提交一直显示超时,遂去查看别人的提交,发现超时的提交都是有用到 getchar 或者 !=EOF。。
莫名超时,花了好多时间结果问题出在这里,很痛苦。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
#define max(a, b) ((a) > (b) ? (a) : (b))
int main()
{
int w[61];
int v[61];
int dp[61][1001];
int total;
scanf("%d", &total);
// input.
int val, nums = 1;
char s;
while (~scanf("%d%c", &val, &s))
{
w[nums] = val;
++nums;
if (s != ' ')
break;
};
nums = 1;
while (~scanf("%d%c", &val, &s))
{
v[nums] = val;
++nums;
if (s != ' ')
break;
};
// cal
int i, j;
for (i = 1; i <= nums; i++)
{
for (j = 1; j <= total; j++)
{
if (j - w[i] >= 0)
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + v[i]);
else
dp[i][j] = dp[i - 1][j];
}
}
printf("%d", dp[nums][total]);
system("pause");
return 0;
}