题意:裸01背包,第一行给出n个苹果和容量为m的背包,接下来n行为每个苹果的重量和价值。输出背包能装下的最大价值为多少。
思路:dp公式:dp[j] = max(dp[j],dp[j-cost[i]]+v[i]);
其中dp[j]的值代表当前背包剩余容量为j时最大价值。dp[j-cost[i]]为当前背包装入苹果i的时候(此时背包剩余容量为j-cost[i]),那价值就为dp[j-cost[i]]+v[i]咯。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int c[1010],v[1010],dp[1010],n,m; //c 大小 v 价钱
int _max(int a,int b){return a > b ? a : b;}
void input()
{
memset(dp,0,sizeof(dp));
for(int i = 0 ; i < n ; i++)
cin >> c[i] >> v[i];
}
void solve()
{
int ans = 0;
for(int i = 0 ; i < n ; i++)
for(int j = m; j >= c[i] ; j--)
{
dp[j] = _max(dp[j],dp[j-c[i]]+v[i]);
}
cout << dp[m] << endl;
}
int main()
{
#ifdef H_R
freopen("in.txt","r",stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(false);
while(cin >> n >> m,m+n)
{
input();
solve();
}
return 0;
}