没优化果然华丽丽的超时了.....其他就不说了,基本的多重背包.....
AC代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
inline int max( int a, int b ){
return ( a > b ? a : b );
}
int main(){
int Cash, N;
int value[10], number[10];
int dp[100000];
while( scanf( "%d%d", &Cash, &N ) != EOF ){
for( int i = 0; i < N; i++ ){
cin >> number[i] >> value[i];
}
memset( dp, 0, sizeof( dp ) );
for( int i = 0; i < N; i++ ){
int k;
for( k = 1; 2 * k - 1 < number[i]; k = k * 2 ){//注意优化......
for( int j = Cash; j >= k * value[i]; j-- ){
dp[j] = max( dp[j], dp[j- k * value[i]] + k * value[i] );//一定要注意这里是k * value[i]啊!!!!!!不是value[i]!!!!!!
}
}
k = number[i] - k + 1;
for( int j = Cash; j >= k * value[i]; j-- ){
dp[j] = max( dp[j], dp[j- k * value[i]] + k * value[i] );//一定要注意这里是k * value[i]啊!!!!!!不是value[i]!!!!!!
}
}
cout << dp[Cash] << endl;
}
return 0;
}