完全背包问题的叙述如下:
有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 <stdio.h>
#include <algorithm>
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
*/