今晚本来是在学C++的,看到了Q群上一位朋友写的背包问题出错,帮他改了下。。。结果。。。
总结下:
1、想好了再写
2、细心再细心
3、自己的代码,自己会介意!
View Code
#include <iostream> using namespace std; int main() { //背包问题,利用了局部优化,w为商品的重量,W[0]应该不是商品,表示没有商品装下 int n,v,i=0,j=0,temp; while(cin>>n>>v) { int *w=new int[n]; for(i=1;i<=n;i++)//重量,这应该是从i=1开始 { cin>>w[i]; } int **val=new int*[n+1];//二维数组 for (i=0;i<=n;i++) { val[i]=new int[v+1]; } for (i=0;i<=n;i++)//初始化列 { val[i][0]=0; } for (j=0;j<=v;j++)//初始化行 { val[0][j]=0; } for(i=1;i<=n;i++)//主循环 { for(j=1;j<=v;j++) { val[i][j]=val[i-1][j]; if(w[i]<=j) { temp=val[i-1][j-w[i]]+w[i]; if(temp>val[i][j]) val[i][j]=temp; } cout<<"val["<<i<<"]"<<"["<<j<<"]:"<<val[i][j]<<endl; } } int *c = new int[n]; for (i=n;i>=0;i--)//这只为:i>=0 { c[i]=0; } j=v; for (i=n;i>0;i--) { if(val[i][j]>val[i-1][j]) { c[i]=1; j-=w[i]; } } cout<<val[n][v]<<endl; for (i=0;i<=n;i++) { if (c[i]==1)//这里的判断错了,为c[i]==1 { cout<<w[i]<<" "; } } cout<<endl; } std::system("pause"); }