2671: 01-package

Total Submit: 761 Accepted:289
Description
给定一个背包的容量k,给定n个物品的体积和价值,物品不可分割,将n个物品中选若干个物品放入背包,求背包内物品的最大价值总和,在价值总和最大的前提下求背包内的最小物品个数c。
Input
第一行是一个整数t,表示测试数据的组数t。
对于每组测试数据,第一行是两个整数n和k,表示物品的个数和背包的容量;
接下来n行,每行两个整数,分别是物品的价值和体积。所有整数都不超过1000。
Output
输出背包内物品的最大价值v,在价值最大的前提下求背包内的最小物品个数c,中间用一个空格隔开。
Sample Input
1
3 10
4 5
6 5
10 10
Sample Output
10 1
Source
AC代码:
#include<stdio.h>
#include<string.h>
int main()
{
int dp[1000],wei[1000],cost[1000],v[1000];
int i,t,n,k,j;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&k);
memset(dp,0,1000);
memset(v,0,1000);
for(i = 1;i <= n;i++)
scanf("%d %d",&cost[i],&wei[i]);
for(i = 1;i <= n; i++)
{
for(j = k;j >= wei[i]; j--)
{
if(dp[j] < dp[j-wei[i]] + cost[i] || (dp[j] == dp[j - wei[i]] + cost[i] && v[j] > v[j - wei[i]] + 1))
{
dp[j] = dp[j - wei[i]] + cost[i];
v[j] = v[j- wei[i]] + 1;
}
}
}
printf("%d %d\n",dp[k],v[k]);
}
return 0;
}