二維費用的背包問題是指:對于每件物品玛迄,具有兩種不同的費用哭当,選擇這件物品必
須同時付出這兩種費用。對于每種費用都有一個可付出的最大值(背包容量)硕并。問怎樣
選擇物品可以得到最大的價值膊升。
設第 i 件物品所需的兩種費用分別為 Ci 和 Di怎炊。兩種費用可付出的最大值(也即兩
種背包容量)分別為 V 和 U。物品的價值為 Wi廓译。
有時评肆,“二維費用”的條件是以這樣一種隱含的方式給出的:最多只能取 U 件物品。
http://acm.hdu.edu.cn/showproblem.php?pid=2159
二維費用背包之完全背包
#include <cstdio>
#include<algorithm>
#include<string.h>
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
using namespace std;
int main()
{
int n,m,k,s;
int dp[105][105];
int cost[105];
int exp[105];
while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=k;i++)
{
scanf("%d%d",exp+i,cost+i);
}
for(int i=1;i<=k;i++)
{
for(int j=1;j<=s;j++)
{
for(int q=cost[i];q<=m;q++)
{
dp[j][q]=Max(dp[j][q],dp[j-1][q-cost[i]]+exp[i]);
}
}
}
if(dp[s][m]<n)
{
printf("-1\n");
}
else
{
int tmp=0;
for(int i=1;i<=m;i++)
{
if(dp[s][i]>=n)
{
tmp=i;
break;
}
}
printf("%d\n",m-tmp);
}
}
}