背包问题~~!C++

5 10 //5代表5件物品 10代表 取这5件物品种 哪几样 可以加起来为10

1 2 3 4 5

//第1件物品重量1

//第2件物品重量2

//第3件物品重量3

//第4件物品重量4

//第5件物品重量5

现在我们想,我们有一个布袋,初始状态里面是空的,意味着哪几方面信息?

第一, 重量为0

第二, 物品个数为0

第三, 总重量不等于10

以上状态我们用0来表示

接下来我们分析我们对第一个物品可以做的事,就是把他放进布袋,或不放进布袋

那们结合前面的0状态,再加上第一个物品的两个状态就可以看到以下情况:

复制代码
                            0
                        0        1                  0代表不取    1代表取

如果这看明白了,在对一个物品处理之后,就是处理第二个物品

是不是:

复制代码
                      0

0 1

0 1 0 1

同样第三个,第四个也是这原理

复制代码
                        0

0 1

0 1 0 1

0 1 0 1 0 1 0 1

...

如果以上能理解了,就应当有递归的感觉了

题目要求:找到一组解即可。说明会有很多情况其实是可以满足要求的:

比如上面的案例: 1234为10 145为10 235为10

接下来用代码写函数

cpp 复制代码
5  10    //5代表5件物品     10代表 取这5件物品种 哪几样 可以加起来为10
1	2  3  4  5    


//第1件物品重量1
//第2件物品重量2
//第3件物品重量3
//第4件物品重量4
//第5件物品重量5


现在我们想,我们有一个布袋,初始状态里面是空的,意味着哪几方面信息?
第一,	重量为0
第二,	物品个数为0
第三,	总重量不等于10

以上状态我们用0来表示

接下来我们分析我们对第一个物品可以做的事,就是把他放进布袋,或不放进布袋
那们结合前面的0状态,再加上第一个物品的两个状态就可以看到以下情况:


                                0
                            0        1                  0代表不取    1代表取

如果这看明白了,在对一个物品处理之后,就是处理第二个物品


是不是:

                          0
0	  1
                  0     1   0   1
同样第三个,第四个也是这原理


                            0
0	    1
                  0     1      0    1
0   1  0  1   0  1  0  1
                         .....


如果以上能理解了,就应当有递归的感觉了     
题目要求:找到一组解即可。说明会有很多情况其实是可以满足要求的:
比如上面的案例:  1234为10          145为10    235为10
接下来用代码写函数
#include<iostream>
using namespace std;
typedef struct {
    int index;
    int value;
}Data;

int a[10000],s,n;
Data data[10000];
int size; 
bool check(int Sumweigth,int cnt){  
    if(cnt==-1) return Sumweigth==s;//如没有可选,返回布袋与要求的是否一致
    else if(check(Sumweigth+a[cnt],cnt-1)){//当前位置放入布袋继续分析
        data[size].index=cnt;
        data[size].value=a[cnt];
        size++;
        return true; 
    }else if(check(Sumweigth,cnt-1)){//当前位置没进包里,继续分析 
        return true;
    }
    return false ;
} 
void print(){    
    for(int i=0;i<size;i++)
        cout<<"number:"<<data[i].index+1<<" weight:"<<data[i].value<<endl;//index+1 因为下标是从0开始的  
}
void solve(){
    cin>>n>>s;
    for(int i=0;i<n;i++)    
        cin>>a[i];
    
    if(check(0,n-1))    
        print();    
    else    
        cout<<"not found"<<endl;    
}
int main(){
    solve();    
    return 0;
} 
 
相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛