原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2602
题目大意:
有一个体积为V的背包。要装价值尽可能大的石头。问怎么装
思路:
简单背包问题。
每个石头都可以装或者不装。可以得到状态转移方程
dp[j] = max( dp[j] , dp[ j - bone[i].cost ] + bone[i].value )
最后dp[V]中的值就是我们要的答案。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct I
{
int cost;//石头的体积
int value;//石头的价值
}bone[1005];
int dp[1005];//存储体积为i时。能装石头的最大价值
int main()
{
int T;
scanf("%d",&T);
while( T-- )
{
int N,V;
scanf("%d %d",&N,&V);
int i;
//题目中是先输入价值再输入体积。开始的时候被坑了
for( i = 1; i <= N; i++ )
scanf("%d",&bone[i].value );
for( i = 1; i <= N; i++ )
scanf("%d",&bone[i].cost);
//初始化很关键
memset( dp,0,sizeof( dp ));
int j;
for( i = 1; i <= N; i++ )
{
for( j = V; j >= bone[i].cost ; j--
)
dp[j] = max( dp[j],dp[j-
bone[i].cost] + bone[i].value );
}
printf("%d\n",dp[V]);
}
return 0;
}