好吧,这么水的一道题。我实在不知道怎么。。。。。
注意j从0到v。如果小于use[i]的话,就直接等于他之前。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int dp[maxn][maxn];
int val[maxn],use[maxn];
int main() {
memset(dp,0,sizeof(dp));
int n,v;
cin>>v>>n;
for(int i=1; i<=n; i++) {
cin>>use[i]>>val[i];
}
for(int i=1; i<=n; i++)
for(int j=0; j<=v; j++) {
if(j>=use[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-use[i]]+val[i]);
else
dp[i][j]=dp[i-1][j];
}
cout<<dp[n][v]<<endl;
//
return 0;
}
//QωQ
内个啥的优化。。。。。。。。。滚动数组
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int dp[3][maxn];
int val[maxn],use[maxn];
int main() {
memset(dp,0,sizeof(dp));
int n,v;
cin>>v>>n;
for(int i=1; i<=n; i++) {
cin>>use[i]>>val[i];
}
for(int i=1; i<=n; i++)
for(int j=0; j<=v; j++) {
if(j>=use[i])
dp[i&1][j]=max(dp[(i-1)&1][j],dp[(i-1)&1][j-use[i]]+val[i]);
else
dp[i&1][j]=dp[(i-1)&1][j];
}
cout<<dp[n&1][v]<<endl;
//
return 0;
}
//QωQ