題目:http://120.78.128.11/Problem.jsp?pid=2053
這題看起來是一題普通揹包題,但是你會發現相對價格來說,體積太大了,此時只要將體積看爲價格,價格看爲體積,然後再來一個普通的揹包DP算法就好了;
#include<stdio.h>
#include<algorithm>
using namespace std;
struct N
{
int w, v;
}a[610];
int dp[5050];
int main( )
{
int n, t, i, j, V, r;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &V);
for(i=r=0; i<n; i++)
scanf("%d%d", &a[i].w, &a[i].v), r+=a[i].v;
for(i=1; i<=r; i++)
dp[i]=1e9;
for(i=dp[0]=0; i<n; i++)
for(j=r; j>=a[i].v; j--)
dp[j]=min(dp[j], dp[j-a[i].v]+a[i].w);
for(i=1, j=0; i<=r; i++)
if(dp[i]<=V&&j<i)
j=i;
printf("%d\n", j);
}
}