您的位置:首页 > 其它

动态规划之01背包问题

2009-12-04 20:27 471 查看
先贴代码:

 

#include<iostream>
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]);/*输入每个物品的重量W和价值V*/
for(i=0;i<10;i++)/*初始化数组C*/
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)/*如果物品的重量小于当前背包的容量*/
{
/*如果当前物品的价值+剩余容量所能装载的最大价值〉在没有选择当前物品时的最大价值则更新C[][];*/
if(c[i-1][j]<v[i]+c[i-1][j-w[i]])
c[i][j]=v[i]+c[i-1][j-w[i]];
else//否则不更新
c[i][j]=c[i-1][j];
}
else/*如果物品的重量大于当前背包的容量,那么这个物品不使用,这表明C[][]不变,则C[][]使用前面得到的最优解*/
c[i][j]=c[i-1][j];
}
return c
[m];
}
int main()
{
int n,m;/*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("%3d",c[i][j]);
printf("/n");
}
return 0;
}
/*
测试用例为:
10 5//10是背包容量,5是背包个数
2 6
2 3
6 5
5 4
4 6
*/


 

上面的算法没有提供找最优解序列的方法,下面给出找最有解序列的代码

#include<iostream>
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++)/*初始化数组C*/
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)/*如果物品的重量小于当前背包的容量*/
{
/*如果当前物品的价值+剩余容量所能装载的最大价值〉在没有选择当前物品时的最大价值则更新C[][];*/
if(c[i-1][j]<v[i]+c[i-1][j-w[i]])
{
c[i][j]=v[i]+c[i-1][j-w[i]];
}
else//否则不更新
{
c[i][j]=c[i-1][j];
}
}
else/*如果物品的重量大于当前背包的容量,那么这个物品不使用,这表明C[][]不变,则C[][]使用前面得到的最优解*/
{
c[i][j]=c[i-1][j];
}
}
return c
[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;/*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]);/*输入每个物品的重量W和价值V*/

printf("%d",Knapsack(n,m,w,v));
printf("/n");

for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
printf("%3d",c[i][j]);
printf("/n");
}
Trackback(c,w,m,n);//找最优解
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;
return 0;
}
/*
测试用例为:
//10是背包容量,5是背包个数
10 5
2 6
2 3
6 5
5 4
4 6
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 测试 input 算法