Chinaunix首页 | 论坛 | 博客
  • 博客访问: 189300
  • 博文数量: 54
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 630
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-02 18:41
文章分类

全部博文(54)

文章存档

2011年(1)

2009年(30)

2008年(23)

我的朋友

分类:

2008-11-27 17:01:46

输入两个整数n和m,从数列1,2,3,…,n中随意取数,使其和等于m,要求将其中所有可能的组合列出来。
 
这是一个0-1背包问题。有一个体积为m的箱子,有1-n体积的物体n个,求填充方法。
 
 

#include <iostream>
#include <string>
using namespace std;
int mVal,nVal;
int *pOut; //箱子,即数组,初始化为0,为1表示取箱子

int sum=0; //解法计数

void output()
{
    cout<<"第"<<sum<<"解法: ";
    for(int i=1; i<=nVal; i++)
        if(pOut[i])
            cout<<i<<' ';
    cout<<endl;
}

//m——剩余体积,n——剩余的最大物品体积

void find(int m, int n)
{
    if(m<1 || n<1 || (1==n)&&(m>1))
        return;
    if(m==n)
    {
        pOut[n]=1;
        sum++;
        output();
        pOut[n]=0;
    }
    find(m, n-1); //不取n

    pOut[n]=1; //取n

    find(m-n, n-1);
    pOut[n]=0;
}

void main()
{
    cout<<"请输入m: ";
    cin>>mVal;
    cout<<"请输入n: ";
    cin>>nVal;
    if(mVal < nVal) //如果mVal
        nVal=mVal;
    pOut = new int[nVal+1];
    memset(pOut, 0, (nVal+1)*sizeof(int)); //将pOut指示的大小为((nVal+1)*sizeof(int))的内存空间初始化为0,memset以字节为单位

    find(mVal, nVal);
    delete []pOut;
}

阅读(409) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~