Sample Output
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int dp[100][100010]; int main() { int n,money; int Box,m; int w,p; while(~scanf("%d %d",&n,&money)) { memset(dp[0],sizeof(dp)); for(int i=1; i<=n; i++) { scanf("%d %d",&Box,&m); for(int j=0; j<Box; j++)//这里肯定买不到 dp[i][j]=-1; for(int j=Box; j<=money; j++)//这里就是选择i时先用上从的取得的价值-盒子的花费 dp[i][j]=dp[i-1][j-Box]; for(int j=0; j<m; j++) //这里就是用01背包进行更新本层取得的价值 { scanf("%d %d",&w,&p); for(int k=money; k>=w; k--) if(dp[i][k-w]!=-1) dp[i][k]=max(dp[i][k],dp[i][k-w]+p); } for(int j=0; j<=money; j++)//这里更新是因为不是每次求的得就是最大的因为它是在减去篮子钱的基础上和本层的比较 dp[i][j]=max(dp[i-1][j],dp[i][j]); } printf("%d\n",dp[n][money]); } return 0; }
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int dp[100010]; int tem[100010]; int main() { int n,&money)) { memset(dp,&m); memcpy(tem,dp,sizeof(dp)); /*for(int j=Box; j<=money; j++)//这里就是选择i时先用上从的取得的价值-盒子的花费 dp[i][j]=dp[i-1][j-Box];*/ for(int j=0; j<m; j++) //这里就是用01背包进行更新本层取得的价值 { scanf("%d %d",&p); for(int k=money-Box; k>=w; k--) tem[k]=max(tem[k],tem[k-w]+p); } for(int j=Box; j<=money; j++)//这里更新是因为不是每次求的得就是最大的因为它是在减去篮子钱的基础上和本层的比较 dp[j]=max(dp[j],tem[j-Box]); } printf("%d\n",dp[money]); } return 0; }
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int dp[100][100010]; int main() { int n,&m); for(int j=0; j<Box; j++)//这里肯定买不到 dp[i][j]=-INF; /*for(int j=Box; j<=money; j++)//这里就是选择i时先用上从的取得的价值-盒子的花费 dp[i][j]=dp[i-1][j-Box];*/ for(int j=0; j<m; j++) //这里就是用01背包进行更新本层取得的价值 { scanf("%d %d",&p); for(int k=money; k>=w; k--) dp[i][k]=max(dp[i][k],dp[i-1][k-w-money]+p); } /*for(int j=0; j<=money; j++)//这里更新是因为不是每次求的得就是最大的因为它是在减去篮子钱的基础上和本层的比较 dp[i][j]=max(dp[i-1][j],dp[i][j]);*/ } printf("%d\n",dp[n][money]); } return 0; } //这种情况我本来想忽略最后的比较但是忘了一个很重要的问题那就是如果不比较那么开始的杀死后全部赋值为-INF那么这个地方就影院不会更新