这个题目一眼就知道出题者的意思,思路秒杀,但是没有用一维数组的时候居然会超时我也是很无语,好想用一维数组或者滚动数组真的可以有效降低时间复杂度之前的常数,大概跟计算机中的读取数据的方式应该是有关系的,看来一维数组和滚动数组还是要多多练习。
题目链接:https://vjudge.net/problem/HDU-1171
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 5002 , maxs = 5002;
int dp[250002];
int cntn , sum;
int v[maxn];
void solve () {
for (int i = 1 ; i <= cntn ; i++) {
for (int j = sum/2 ; j >= 1 ; j--) {
if (j-v[i] >= 0) dp[j] = max(dp[j] , dp[j-v[i]]+v[i]);
}
}
printf ("%d %d\n" , sum-dp[sum/2] , dp[sum/2]);
}
int main () {
while (scanf("%d" , &cntn) != EOF && cntn >= 0) {
memset(dp,0,sizeof(dp));
memset(v,0,sizeof(v));
int index = 1;
sum = 0;
for (int i = 1 ; i <= cntn ; i++) {
int tv , tc;
scanf("%d%d" , &tv , &tc);
for (int j = 0 ; j < tc ; j++) {
v[index++] = tv;
sum += tv;
}
}
cntn = index-1;
solve();
}
}