hiho第七周——完全背包(动态规划)
题目链接:http://hihocoder.com/problemset/problem/1043
注意点
1、和第六周的01背包相比较,状态公式不同
01背包:best(i,x) = max{best(i-1,x),best(i-1,x-need(i))+value(i)}
完全背包:best(i,x) = max{best(i-1,x),best(i,x-need(i))+value(i)}
所以在只用一维动态数组best时:
01背包从后往前计算best(x);完全背包从前往后计算best(x)
可执行代码
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream cin("input.txt");
int N,M;//礼品种类,奖券数
cin>>N>>M;
int *need = new int[N];
int *value = new int[N];
for(int i = 0;i<N;i++)
cin>>need[i]>>value[i];
int * best = new int[M+1];
for(int i = 0;i<=M;i++)
best[i] = 0;
for(int i = 0;i<N;i++)
{
for(int j = 0;j<=M;j++)
{
if(j>=need[i])
best[j] = max(best[j],best[j-need[i]]+value[i]);
}
}
cout<<best[M];
delete[] need,value,best;
return 0;
}