http://acm.jlu.edu.cn/joj/showproblem.php?pid=2526 最基本的0-1背包问题 动态规划 2维解法 (因为数组开错 导致wa 所以贴出来警示自己) #include<stdio.h> #include<iostream> using namespace std; #define T 1005 #define M 105 int f[M][T]; int max(int a,int b){ if(a>=b) return a; return b; } int main(){ int size,m; int t[T],w[T]; int i,j,ans; while(scanf("%d%d",&size,&m)!=EOF){ for(i=1;i<=m;i++) cin>>t[i]>>w[i]; for(i=0;i<=size;i++) f[0][i]=0; for(i=1;i<=m;i++) for(j=0;j<=size;j++){ if(i==1) f[i][j]=0; else f[i][j]=f[i-1][j]; if(j>=t[i]) f[i][j]=max(f[i-1][j],f[i-1][j-t[i]]+w[i]); } cout<<f[m][size]<<endl; } return 0; } 一维解法 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define T 1005 #define M 105 int f[T]; int max(int a,int b){ if(a>=b) return a; return b; } int main(){ int size,m; int t,w; int i,j; while(scanf("%d%d",&size,&m)!=EOF){ memset(f,0,sizeof(f)); for(i=1;i<=m;i++){ cin>>t>>w; for(j=size;j>=0;j--) if(j>=t) f[j]=max(f[j],f[j-t]+w); } cout<<f[size]<<endl; } return 0; }