背包问题——完全背包问题

完全背包问题的叙述如下:
有n种物品,每种物品的单件重量为w[i],价值为c[i],现有一个容量为V的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。其中每种物品都有无穷件。

完全背包问题的核心代码:

for(int i = 1;i <= M;i++){
		for(int j = tm[i];j <= T;j++){          //正序,完全背包问题 
			dp[j] = max(dp[j],dp[j-tm[i]]+value[i]);
		}
	}

拿采药那个例子改改,使成为一个完全背包问题:
https://www.dotcpp.com/oj/problem1100.html
假设每种药物的数目不限~
代码:

#include 
#include 
using namespace std;

const int maxt = 1000;
const int maxm = 100;
int tm[maxm],value[maxm],dp[maxt];

int main(){
	int T,M;
	scanf("%d %d",&T,&M);
	for(int i = 1;i <=M;i++){
		scanf("%d %d",&tm[i],&value[i]);
	}
	for(int i = 0;i <= T;i++){
		dp[i] = 0;
	}
	for(int i = 1;i <= M;i++){
		for(int j = tm[i];j <= T;j++){   //正序,完全背包问题 
			dp[j] = max(dp[j],dp[j-tm[i]]+value[i]);
		}
	}
	int max = 0;
	for(int v = 0;v <= T;v++){
		if(dp[v] >max){
			max = dp[v];
		}
	}
	printf("%d",max);
}


/*
70 3
71 100
69 1
1 2

//此种方案考虑最大的 
70 3
70 100
69 1
1 2

//此种方案考虑性价比 
70 4
69 3
7 2
5 1
58 2


*/

你可能感兴趣的:(提高篇——动态规划)