背景是关于贪心法解决背包问题
程序上还存在不少的问题,主要想说是关于堆栈损坏的问题,上网搜过了很多。很多都是这样:project->配置属性->c/c+±>代码生成->基本运行时检查为默认值。但是还是不知道为什么?还有说是内存分配的问题,new完之后,需要delete,但是我这根本就没有申请内存分配空间,所以说,跟这关系应该也不大。
=here =
里面有一条回复帮助很大,说用malloc申请内存的方法,而且出现的问题也非常相近,给了我一点思路,会不会是数组初始化的问题?然后我把int input[] = { 0 };改成了
int input[ 10 ] ;
for ( int i = 0 ; i < NUM; i++ )
input[ i] = 0 ;
果不其然,问题解决了。
#include <iostream>
#define NUM 10
using namespace std;
void sort ( int w[ ] , int v[ ] ) ;
void knapsack ( int [ ] , int [ ] , int ) ;
void sort ( int w[ ] , int v[ ] )
{
char average[ NUM] ;
for ( int i = 0 ; i < NUM; i++ )
average[ i] = ( char ) v[ i] / w[ i] ;
int length = NUM;
while ( length > 0 )
{
for ( int i = 0 ; i < length; i++ )
if ( average[ i] < average[ i + 1 ] )
{
int weight_exchange = w[ i] ;
w[ i] = w[ i + 1 ] ;
w[ i + 1 ] = weight_exchange;
int value_exchange = v[ i] ;
v[ i] = v[ i + 1 ] ;
v[ i + 1 ] = value_exchange;
}
length-- ;
}
}
void knapsack ( int w[ ] , int v[ ] , int C)
{
sort ( w, v) ;
int input[ 10 ] ;
for ( int i = 0 ; i < NUM; i++ )
input[ i] = 0 ;
int maxvalue = 0 ;
for ( int i = 0 ; w[ i] < C; i++ )
{
input[ i] = 1 ;
C = C - w[ i] ;
}
cout << "背包里放入的物品重量及其价值" << endl;
for ( int i = 0 ; i < NUM; i++ )
{
maxvalue + = input[ i] * v[ i] ;
if ( input[ i] == 1 )
cout << w[ i] << v[ i] ;
}
cout << "背包里的总价值" << endl;
cout << maxvalue << endl;
}
int main ( )
{
int w[ 7 ] = { 2 , 3 , 5 , 7 , 1 , 4 , 1 } ;
int v[ 7 ] = { 10 , 5 , 15 , 7 , 6 , 18 , 3 } ;
knapsack ( w, v, 15 ) ;
}
最后最后还有一点就是这个算法不够好,或者说,我写的不好,最优解是v[0],v[1],v[2],v[4],v[5],但是实际是v[0],v[1],v[2],v[4]。这个问题以后再说吧。