你的动归方程有问题:j<v[i]时,i那一维并没有从i-1转移过来,可能是落谷数据太弱,让你90.我给你修改了一下,附你的 修正的 ac代码:
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m;//n表示总钱数,m为希望购买物品的个数。
int v[50],p[50];//v表示物品价格,p表示物品重要度
int dp[30][30010];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>v[i]>>p[i];
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
{
if(j>=v[i])dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+v[i]*p[i]);
else dp[i][j]=dp[i-1][j];
}
}
}
cout<<dp[m][n];
return 0;
}
```
by Ciel_bleu @ 2017-04-11 18:08:58
@[初中Gunbuster](/space/show?uid=29473) 代码风格没有恢复自己的风格。帮你恢复
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m;//n表示总钱数,m为希望购买物品的个数。
int v[50],p[50];//v表示物品价格,p表示物品重要度
int dp[30][30010];
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>v[i]>>p[i];
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
{
if(j>=v[i])dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+v[i]*p[i]);
else dp[i][j]=dp[i-1][j];
}
}
}
cout<<dp[m][n];
return 0;
}
```
by FlyingAnt @ 2017-04-11 18:10:56
区别是在if()的判断上吗?如果j从v[i]枚举到n呢?
by EricPaul @ 2017-04-11 18:12:17
如果从v[i]枚举到n,那v[i]以下的部分就没有值了,显然不对,。
by Ciel_bleu @ 2017-04-11 18:13:18
一维滚动数组:
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m;
int v[50],p[50];
int dp[30010];
int main()
{
int i,j;
cin>>n>>m;
for(i=1;i<=m;i++)
cin>>v[i]>>p[i];
for(i=1;i<=m;i++)
for(j=n;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+v[i]*p[i]);
cout<<dp[n];
return 0;
}
```
by rxzfn @ 2017-04-12 18:50:58
此时的dp[j]是上一次的dp[j],就代表了i-1
by rxzfn @ 2017-04-12 18:53:51
v[i]以下的不能减v[i],而此时的dp[j]是上一次的dp[j](上一次讲过了)
by rxzfn @ 2017-04-12 18:56:17