动态规划求解0/1背包

 1 #include<iostream>
2 #define Max 20
3 using namespace std;
4 /**
5 n:物品数 m:最大限额重量
6 w[n]:n个物品的重量 p[n]n个物品的单价
7 x[n]:n个物品是否被选中放入背包
8 **/
9 int n,m,w[Max],p[Max],*f[Max],x[Max];
10 int main(){
11 cin>>n>>m;
12 for(int i=1;i<=n;i++){
13 cin>>w[i]>>p[i];
14 }
15 for(int i=0;i<=n;i++){
16 f[i]=new int[m+1];
17 for(int j=0;j<=m;j++){
18 f[i][j]=0;
19 }
20 }
21 for(int i=1;i<=n;i++){
22 for(int j=1;j<=m;j++){
23 if(w[i]<=j){
24 /*本物品的价值与背包剩余空间所能得到的最大价值之和*/
25 /*与上一次得到的最大价值,即不放本物品的情况进行比较,选择是本次操作能得到较大价值*/
26 f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+p[i]);
27 }else f[i][j]=f[i-1][j];
28 }
29 }
30 /*f[n][m]为所能得到的最大价值*/
31 cout<<"max price:"<<f[n][m]<<endl;
32 for(int i=n;i>0;i--){
33 if(f[i][m]==f[i-1][m])x[i]=0;/*如果价值不变,则没有放入物品i*/
34 else {
35 x[i]=1;/*否则,标记,继续前推*/
36 m-=w[i];
37 }
38 }
39 for(int i=1;i<=n;i++)cout<<x[i];
40 cout<<endl;
41 for(int i=1;i<=n;i++){
42 if(x[i]==1)cout<<"(w,p):("<<w[i]<<","<<p[i]<<")"<<endl;
43 }
44 for(int i=0;i<=n;i++)
45 delete[] f[i];
46 return 0;
47 }
-------------------------------~问世间情为何物,敲敲代码停不住~ -------------------------------
原文地址:https://www.cnblogs.com/bigmengzi/p/2284944.html