- 马上就要校赛了,也不能太水了吧,把学过的再自己打一边
- 这次一个字的书也不看 - -!
B - 湫湫系列故事——减肥记I HDU - 4508 最基本的,但是因为三层循环导致TLE- 笨的要死,是因为dp数组开小了- -! 引以为戒
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int dp[11000][11000];
int n,W;
int w[110];
int v[110];
void solve(){
for(int i = 0;i < n;i++){
for(int j = 0;j <= W;j++){
for(int k = 0;k * w[i] <= j;k++){
dp[i+1][j] = max(dp[i+1][j],dp[i][j-k*w[i]]+k*v[i]);
}
}
}
return;
}
int main(){
while(~scanf("%d",&n)){
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++){
scanf("%d %d",&v[i],&w[i]);
}
scanf("%d",&W);
solve();
cout<<dp[n][W]<<endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int dp[11000][11000];
int n,W;
int w[110];
int v[110];
void solve(){
for(int i = 0;i < n;i++){
for(int j = 0;j <= W;j++){
if(j < w[i]) dp[i+1][j] = dp[i][j];
else{
dp[i+1][j] = max(dp[i][j],dp[i+1][j-w[i]] + v[i]);
}
}
}
return;
}
int main(){
while(~scanf("%d",&n)){
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++){
scanf("%d %d",&v[i],&w[i]);
}
scanf("%d",&W);
solve();
cout<<dp[n][W]<<endl;
}
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int dp[110000];
int n,W;
int w[110];
int v[110];
void solve(){
for(int i = 0;i < n;i++){
for(int j = w[i];j <= W;j++){
dp[j] = max(dp[j],dp[j-w[i]]+v[i]);
}
}
return;
}
int main(){
while(~scanf("%d",&n)){
memset(dp,0,sizeof(dp));
for(int i = 0;i < n;i++){
scanf("%d %d",&v[i],&w[i]);
}
scanf("%d",&W);
solve();
cout<<dp[W]<<endl;
}
return 0;
}