背包问题

今晚本来是在学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");
}
别让别人来告诉你,你成不了才,如果你有梦想的话,就要去捍卫它---当幸福来敲门
原文地址:https://www.cnblogs.com/yihua/p/2960577.html