#include <stdio.h>
#include <stdlib.h>
int m[20][20],p[20],w[20];
int max(int i,int j)
{
if(i>j) return i;
return j;
}
int min(int i,int j)
{
if(i<j) return i;
return j;
}
void knap(int M,int n)
{
int jmax,i,j;
jmax=min(w[n]-1,M);
for(j=0;j<=jmax;j++) m[n][j]=0;
for(j=w[n];j<=M;j++) m[n][j]=p[n];//填最后一行矩阵
for(i=n-1;i>=1;i--)
{
jmax=min(w[i]-1,M);
for(j=0;j<=jmax;j++) m[i][j]=m[i+1][j];
for(j=w[i];j<=M;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+p[i]);
//填中间矩阵
}
if(w[1]<M) m[1][M]=max(m[2][M],m[2][M-w[1]]+p[1]);
else m[1][M]=m[2][M];
}
int main()
{
int i,n,M;
freopen("input.txt","r",stdin); //从in.txt 中读入数据
freopen("out2.txt","w",stdout);
scanf("%d%d",&M,&n);
for(i=1;i<=n;i++)
scanf("%d%d",&w[i],&p[i]);
knap(M,n);
printf("%d",m[1][M]);
fclose(stdin);
fclose(stdout);
return 0;
}
0-1背包问题动态规划
最新推荐文章于 2024-05-21 12:27:54 发布