- #include
- using namespace std;
- int c[10][100];
- int Knapsack(int n,int m)
- {
- int i,j;
- int w[10],v[10];
- for(i=1;i<=n;i++)
- scanf("%d%d",&w[i],&v[i]);
- for(i=0;i<10;i++)
- for(j=0;j<100;j++)
- c[i][j]=0;
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- {
- if(w[i]<=j)
- {
- if(c[i-1][j]
- c[i][j]=v[i]+c[i-1][j-w[i]];
- else//否則不更新
- c[i][j]=c[i-1][j];
- }
- else
- c[i][j]=c[i-1][j];
- }
- return c[n][m];
- }
- int main()
- {
- int n,m;
- printf("input m and n/n");
- scanf("%d%d",&m,&n);
- printf("%d",Knapsack(n,m));
- printf("/n");
- int i,j;
- for(i=0;i<=n;i++)
- {
- for(j=0;j<=m;j++)
- printf("=",c[i][j]);
- printf("/n");
- }
- return 0;
- }
上面的算法沒有提供找最優解序列的方法,下面給出找最有解序列的代碼
- #include
- using namespace std;
- int c[10][100];
- int x[10];//存放最優解
- int Knapsack(int n,int m,int w[],int v[])
- {
- int i,j;
- for(i=0;i<10;i++)
- for(j=0;j<100;j++)
- c[i][j]=0;
- for(i=1;i<=n;i++)
- for(j=1;j<=m;j++)
- {
- if(w[i]<=j)
- {
- if(c[i-1][j]
- {
- c[i][j]=v[i]+c[i-1][j-w[i]];
- }
- else//否則不更新
- {
- c[i][j]=c[i-1][j];
- }
- }
- else
- {
- c[i][j]=c[i-1][j];
- }
- }
- return c[n][m];//矩陣的最後一個爲最優解。
- }
- void Trackback(int c[][100],int w[],int m,int n)
- {
- int i;
- for(i=n;i>0;i--)
- {
- if(c[i][m]==c[i-1][m])//表示序號爲i的物品沒有被裝入揹包
- x[i]=0;
- else
- {
- x[i]=1;
- m-=w[i];
- }
- }
- }
- int main()
- {
- int n,m;
- int i,j;
- printf("input m and n/n");
- scanf("%d%d",&m,&n);
- int w[10],v[10];
- for(i=1;i<=n;i++)
- scanf("%d%d",&w[i],&v[i]);
- printf("%d",Knapsack(n,m,w,v));
- printf("/n");
- for(i=0;i<=n;i++)
- {
- for(j=0;j<=m;j++)
- printf("=",c[i][j]);
- printf("/n");
- }
- Trackback(c,w,m,n);//找最優解
- for(i=1;i<=n;i++)
- cout<<x[i]<<" ";
- cout<<endl;
- return 0;
- }