這實際上並不是標準的0-1揹包問題,可以認爲所有物品的價值都是1。而且也不是尋找最優解,而是輸出所有可能的解,所以深度優先搜索(DFS)就顯得格外合適。
全局區的變量會被自動置零,可以不用賦初值。
#include <cstdio>
#define MAX 100
int solution_cnt;//解方案數
int bag_capacity;//包容量
int items_cnt,w[MAX+1];//物品數量,單個物體重量
int selected_ids[MAX+1];//答案,被選擇的物體id
int book[MAX+1];//標記數組,標記已經使用過的id位置
void dfs(int current_weight,int n,int start_up)
//dfs(當前質量,當前添加的物品數,當前從某個物體向後取)
//添加start_up分量防止如1 3 2 和 1 2 3的重複,start_up遞增保證單向查找
{
if(current_weight>bag_capacity)//重量超過了就不可能了,沒有負質量的東西,不要再找了
return ;
if(current_weight==bag_capacity)//剛好滿足,開始打印
{
printf("Solution #%d\n",solution_cnt++);
int tmp_weight=0;
for(int i=0;i<n;++i)
printf("item id:%d,weight %d,after putting in,the bag weighs %d.\n",\
selected_ids[i],w[selected_ids[i]],tmp_weight+=w[selected_ids[i]] );
putchar('\n');
return ;//一定要在這裏終止
}
for(int i=start_up;i<items_cnt;++i)
if(!book[i])//i號物品還沒有裝入
{
selected_ids[n]=i;//揹包的第n個槽裝第i號物品
book[i]=1;//第i號物品已被使用
dfs(current_weight+w[i],n+1,i);//從第i號物品向後找,做成一個新的狀態
book[i]=0;//不使用i號物品,再試試下一個
}
}
int main(int argc, char const *argv[])
{
scanf("%d%d",&bag_capacity,&items_cnt);
for(int i=0;i<items_cnt;++i)
scanf("%d",&w[i]);
dfs(0,0,0);
if(!solution_cnt) printf("No solution to the given data.\n");
return 0;
}