⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 背包问题扩展一.cpp

📁 这是经典的背包问题
💻 CPP
字号:
#include<iostream>
using namespace std;

int main(){
	int n;
	cout<<"Please input the number of things: ";             //输入物品总数
	cin>>n;
	int *Weight=new int[n];
	
	int Capacity;
	cout<<endl<<"Please input the capacity of bag: ";        //输入背包的载重量
	cin>>Capacity;
	int *sum=new int[Capacity+1];                            //sum[i]存储的是载重量为i时解法的个数,因此申请空间时必须空出一位sum[0]
	for (int i=0; i<(Capacity+1); i++)
		sum[i]=0;                                            //sum数组的初始化
	
	cout<<endl<<"Please input each thing's weight: ";        
	for (i=0; i<n; i++){                                     //依次输入每个物品的重量
		cin>>Weight[i];
		sum[Weight[i]]++;                                    //容量为 Weight[i] 的背包解法个数增加一
		for (int j=Capacity; j>=1; j--){                     //此步为动态规划对于每一次输入进行一次循环,从背包满负载向前尝试
			if ((Weight[i]+j) <= Capacity)                   //当已经容纳重量 j 的背包尚能容纳重量为 Weight[i] 的物品时
				sum[Weight[i]+j] += sum[j];                  //容量为 Weight[i]+j 的背包的解法的个数就等于容量为 j 的背包的解法个数
		}
	}
	cout<<endl;                                              //输入完毕,此时 sum[Capacity] 的值即是容量为 Capacity 的背包的解法的个数

	cout<<"There are "<<sum[Capacity]<<" solutions."<<endl;  //直接输出解法的个数
	
	delete Weight;
	delete sum;
	return 0;
}

/*
测试数据:
3
40
20
20
20

即有三件物品,背包容量为40,三件物品的重量分别为20、20、20
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -