2240: Dragon's Collection
Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
![]() | 5s | 8192K | 355 | 130 | Standard |
Arthur最终打败了Dragon, 获得了Dragon的所有收集品. 但不幸的是, 他的背包容量有限, 并且他的负重也有限. 因此他只能在不超过背包总容量和总重量限制的前提下选择最有价值的物品.
Input:
本题目包括多个Case。每个Case的第一行有3个数字, 依次是物品的个数n<20, 背包的总容量和最大的重量限制. 之后是n行数据, 每一行包括3个整数, 分别是此物品的价值, 大小和重量.
Output:
对于每一个Case, 输出在满足限制条件下能够获得的最大价值, 每个Case占据一行Sample Input:
3 10 12 8 6 7 5 3 3 9 7 6
Sample Output:
14
Problem Source: skywind
#include<stdio.h>
int f[21][200][200];
int w[21],time[30],ver[30];
//f[i][v][u]=max{f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i]}
int main()
{
int n,t,v,i,j,k;
while(scanf("%d%d%d",&n,&t,&v)==3)
{
for(i=0;i<n;i++) scanf("%d%d%d",&w[i],&time[i],&ver[i]);
for(i=0;i<=t;i++) for(j=0;j<=v;j++)
{
if(time[0]<=i&&ver[0]<=j) f[0][i][j]=w[0];
else f[0][i][j]=0;
}
for(i=1;i<n;i++)
for(j=0;j<=t;j++)
for(k=0;k<=v;k++)
{
f[i][j][k]=f[i-1][j][k];
if(j>=time[i]&&k>=ver[i]&&f[i-1][j-time[i]][k-ver[i]]+w[i]>f[i][j][k])
{
f[i][j][k]=f[i-1][j-time[i]][k-ver[i]]+w[i];
}
}
printf("%d/n",f[n-1][t][v]);
}
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,p;
int dp[200][200];
int val[20],a[20],b[20];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int i,j,k,ca;
while(scanf("%d%d%d",&n,&m,&p)!=-1)
{
for(i=0;i<n;i++)
{
scanf("%d%d%d",val+i,a+i,b+i);
}
memset(dp,0,sizeof(dp));
for(i=0;i<n;i++)
for(j=m;j>=0;j--)
for(k=p;k>=0;k--)
{
if(j-a[i]>=0 && k-b[i]>=0)
dp[j][k]=max(dp[j][k],dp[j-a[i]][k-b[i]]+val[i]);
}
printf("%d/n",dp[m][p]);
}
//system("pause");
return 0;
}
/*
5 15 12
8 9 7
6 3 3
1 2 6
4 2 4
3 3 3
*/