NYOJ 49 开心的小明

来源:互联网 发布:deepin 知乎 编辑:程序博客网 时间:2024/06/11 17:44

点击打开链接

        很多题都可以通过转化,转化为我们比较熟悉的模型,比如说这个题,我们就可以转化为0-1背包处理。把n当作背包容积,m当作物品个数,v当作每种物品的体积,p*v当作每种物品的价值,这样,求物品的价格与重要度乘积的总和最大值,就相当于求背包的最大价值,就可以用0-1背包的方法来解决问题。所以,遇到问题一定要多想。
AC代码:
#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b;
struct nn
{
 int v,p; //v是价格,p是重要度
}a[26];
int dp[30000];
int main()
{
 int i,j,n,t,m;
 scanf("%d",&t);
 while(t--)
 {
  memset(dp,0,sizeof(dp));
  scanf("%d%d",&n,&m);//n是钱数,m是物品个数
  for(i=1;i<=m;i++)
  {
     scanf("%d%d",&a[i].v,&a[i].p);
     for(j=n;j>=a[i].v;j--)
      dp[j]=max(dp[j],dp[j-a[i].v]+a[i].p*a[i].v);
  }
  printf("%d\n",dp[n]);
 }
 return 0;
}