BUPT-DSA 2019 Fall Chap.3 0-1揹包問題

這實際上並不是標準的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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章