今天背包入门了噢~~其实挺开心的啦~~
嘿嘿,虽然题目比较简单,但还是小小的成就感~
这就是算法的乐趣吧~~
加油!!!
#define LOCAL
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 3500 + 10
#define MAX 13800 + 10
int dp[MAX];
int item[MAXN][2];
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\Administrator\\Desktop\\Temp\\ACMTempIn.txt", "r", stdin);
//freopen("C:\\Users\\Administrator\\Desktop\\Temp\\ACMTempOut.txt", "w", stdout);
#endif
int quantity, cubage;
int i = 0,j;
int max;
while(scanf("%d%d", &quantity, &cubage) != EOF)
{
//数据输入
for(i = 0; i < quantity; i++)
{
scanf("%d%d", &item[i][0], &item[i][1]);
}
//构造dp数组
//初始化
memset(dp, 0, sizeof(dp));
for(i = 0; i <= cubage; i++)
{
if(i >= item[quantity - 1][0])
dp[i] = item[quantity - 1][1];
}
//枚举物品
for(i = quantity - 2; i >= 0; i--)
{
//更新dp数组
for(j = cubage; j > 0; j--)
{
if(j >= item[i][0] && dp[j - item[i][0]] + item[i][1] > dp[j])
dp[j] = dp[j - item[i][0]] + item[i][1];
}
}
//找到最大数
max = 0;
for(i = 0; i <= cubage; i++)
{
if(dp[i] > max)
max = dp[i];
}
printf("%d\n", max);
}
return 0;
}