01背包加变形 动态规划的时候就犯浑了,每个状态都要记录的,我却只记录了当前状态的!!
#include<stdio.h> #include<string.h> int max(int a,int b) {return (a) > (b) ? (a) : (b); } int a[12],b[12],M,dp[12][100010];int main(){int N,i,j,k,ma;while(scanf("%d",&M)!=EOF){scanf("%d",&N);ma=0;for(i=1;i<=N;i++){scanf("%d %d",&a[i],&b[i]);ma+=a[i]*b[i];}if(N==0||M==0){printf("0\n");continue;}if(ma<=M){printf("%d\n",ma);continue;}memset(dp,0,sizeof(dp));for(i=1;i<=N;i++){for(j=0;j<=M;j++){for(k=0;k<=a[i];k++){if(j>=k*b[i])dp[i][j]=max(dp[i][j],dp[i-1][j-k*b[i]]+k*b[i]);}}}printf("%d\n",dp[N][M]);}return 0; }