①这种问题要看清楚变量范围 数组范围很容易开错!!!
②这个下限是w[i]!!!很重要 或者加一句判断 if(j-w[i]>=0)
1 for(int i=1;i<=t;i++) 2 { 3 for(int j=n;j>=w[i];j--)//下限!!! 4 dp[j]=max( dp[j] , dp[j-w[i]]+v[i] ); 5 }
AC代码,一维数组可以压缩空间。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 const int maxn_da=3500; 6 const int maxn_dp=13000; 7 int dp[maxn_dp]; 8 int v[maxn_da]; 9 int w[maxn_da]; 10 11 int main() 12 { 13 int t,n; 14 while(cin>>t>>n) 15 { 16 for(int i=1;i<=t;i++) 17 { 18 cin>>w[i]>>v[i]; 19 } 20 21 memset(dp,0,sizeof(dp)); 22 23 for(int i=1;i<=t;i++) 24 { 25 for(int j=n;j>=w[i];j--) 26 dp[j]=max( dp[j] , dp[j-w[i]]+v[i] ); 27 } 28 cout<<dp[n]<<endl; 29 } 30 31 return 0; 32 }
时间: 2024-10-10 14:40:16