求解90原因

P1060 [NOIP2006 普及组] 开心的金明

你的动归方程有问题: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


|