#include<stdio.h>
#include<stdlib.h>
typedef enum //向量数组
{
false,
true
}bool;
int c[15][25]; bool x[25];
int knapsack(int m,int n,int *w,int *p){
bool a;int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(w[i]<=j)
{
a=p[i]+c[i-1][j-w[i]]>c[i-1][j];
c[i][j]=a?p[i]+c[i-1][j-w[i]]:c[i-1][j];
}
else
c[i][j]=c[i-1][j];
}
return (c[n][m]);
}
int getbest(int m,int n,int *w,int *p){
if(n==0) return 0;
if(w[n]>m){
x[n]=0;
getbest(m,n-1,w,p);
}
else
x[n]=c[n-1][m]<=p[n]+c[n-1][m-w[n]];
if(x[n])
getbest(m-w[n],n-1,w,p);
else
getbest(m,n-1,w,p);
}
int main(){
int m,n,i,j;
int *w=NULL;int *p=NULL;
printf("输入背包容量和货物的个数:");
scanf("%d%d",&m,&n);
p=(int *)calloc(n,sizeof(int));
w=(int *)calloc(n,sizeof(int));
if(!p||!w)
{
printf("错误!\n") ;exit(1);
}
for(i=1;i<n+1;i++)
{
printf("物品x%d的重量和价值:",i);
scanf("%d%d",w+i,p+i);
}
//对应取值
printf("对应的取值为:\n");
for(i=1;i<n;i++)
printf("x%d ",i);
printf("\n");
for(i=1;i<=n;i++)
printf("%4d",x[i]);
printf("\n");
//结果
printf("\n最优解为:%d",knapsack(m,n,w,p));
printf("\n");
//输出对应的数组
/* for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("%3d ",c[i][j]);
if(j==m) printf("\n");
}
getbest(m,n,w,p); */
}
#include<stdlib.h>
typedef enum //向量数组
{
false,
true
}bool;
int c[15][25]; bool x[25];
int knapsack(int m,int n,int *w,int *p){
bool a;int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(w[i]<=j)
{
a=p[i]+c[i-1][j-w[i]]>c[i-1][j];
c[i][j]=a?p[i]+c[i-1][j-w[i]]:c[i-1][j];
}
else
c[i][j]=c[i-1][j];
}
return (c[n][m]);
}
int getbest(int m,int n,int *w,int *p){
if(n==0) return 0;
if(w[n]>m){
x[n]=0;
getbest(m,n-1,w,p);
}
else
x[n]=c[n-1][m]<=p[n]+c[n-1][m-w[n]];
if(x[n])
getbest(m-w[n],n-1,w,p);
else
getbest(m,n-1,w,p);
}
int main(){
int m,n,i,j;
int *w=NULL;int *p=NULL;
printf("输入背包容量和货物的个数:");
scanf("%d%d",&m,&n);
p=(int *)calloc(n,sizeof(int));
w=(int *)calloc(n,sizeof(int));
if(!p||!w)
{
printf("错误!\n") ;exit(1);
}
for(i=1;i<n+1;i++)
{
printf("物品x%d的重量和价值:",i);
scanf("%d%d",w+i,p+i);
}
//对应取值
printf("对应的取值为:\n");
for(i=1;i<n;i++)
printf("x%d ",i);
printf("\n");
for(i=1;i<=n;i++)
printf("%4d",x[i]);
printf("\n");
//结果
printf("\n最优解为:%d",knapsack(m,n,w,p));
printf("\n");
//输出对应的数组
/* for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("%3d ",c[i][j]);
if(j==m) printf("\n");
}
getbest(m,n,w,p); */
}