华师一附中OI组
标题:
P1064 金明的预算方案
[打印本页]
作者:
admin
时间:
2018-6-3 12:12
标题:
P1064 金明的预算方案
https://www.luogu.org/problemnew/show/P1064
题目描述
金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过 N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:
主件 附件
电脑 打印机,扫描仪
书柜 图书
书桌 台灯,文具
工作椅 无
如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0个、 1 个或 2 个附件。附件不再有从属于自己的附件。金明想买的东西很多,肯定会超过妈妈限定的 N 元。于是,他把每件物品规定了一个重要度,分为 5 等:用整数 1−5 表示,第 5等最重要。他还从因特网上查到了每件物品的价格(都是 10 元的整数倍)。他希望在不超过 N元(可以等于 N 元)的前提下,使每件物品的价格与重要度的乘积的总和最大。
设第 j 件物品的价格为 v[j] ,重要度为 w[j],共选中了 k件物品,编号依次为 j1,j2,…,k则所求的总和为:
v[j1]*w[j1]+v[j2] *w[j2]+ …+v[jk] *w[jk]
请你帮助金明设计一个满足要求的购物单。
输入输出格式
输入格式:
第 1 行,为两个正整数,用一个空格隔开:
N N (其中 N(<32000) 表示总钱数, m(<60) 为希望购买物品的个数。) 从第 2 行到第 m+1行,第 j 行给出了编号为 j-1的物品的基本数据,每行有 3 个非负整数v p q (其中 v 表示该物品的价格( v<10000 ),p表示该物品的重要度( 1−5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)
输出格式:
一个正整数,为不超过总钱数的物品的价格与重要度乘积的总和的最大值( <200000 )。
输入输出样例
输入样例#1:
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
输出样例#1:
2200
说明
NOIP 2006 提高组 第二题
作者:
Scorpio
时间:
2018-7-10 22:03
#include<iostream>
using namespace std;
int f[33600],mv[72],mp[72],av[72][3],ap[72][3];
int n,m,i,j,v,p,q;
int main()
{
cin>>n>>m;
for(i=1;i<=m;i++)
{
cin>>v>>p>>q;
if(q==0)
{
mv[i]=v;
mp[i]=p;
}
else
{
av[q][0]++;
av[q][av[q][0]]=v;
ap[q][av[q][0]]=p;
}
}
for(i=1;i<=m;i++)
for(j=n;mv[i]!=0&&j>=mv[i];j--)
{
f[j]=max(f[j-mv[i]]+mv[i]*mp[i],f[j]);
if(j>=mv[i]+av[i][1])
f[j]=max(f[j-mv[i]-av[i][1]]+mv[i]*mp[i]+av[i][1]*ap[i][1],f[j]);
if(j>=mv[i]+av[i][2])
f[j]=max(f[j-mv[i]-av[i][2]]+mv[i]*mp[i]+av[i][2]*ap[i][2],f[j]);
if(j>=mv[i]+av[i][1]+av[i][2])
f[j]=max(f[j-mv[i]-av[i][1]-av[i][2]]+mv[i]*mp[i]+av[i][1]*ap[i][1]+av[i][2]*ap[i][2],f[j]);
}
cout<<f[n];
return 0;
}
复制代码
作者:
zhwang
时间:
2018-7-27 20:53
#include<cstdio>
#include<algorithm>
using namespace std;
int c[151][5],v[151][5],q[151];
int n,m;
int biao[151];
int flag;
int f[32001];
int best;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&c[i][1],&v[i][1],&q[i]);
v[i][1]=c[i][1]*v[i][1];
}
for(int i=1;i<=150;i++)
{
biao[i]=1;
}
for(int i=1;i<=m;i++)
{
if(q[i]>0)
{
for(int t=1;t<=m;t++)
{
if(q[i]==t)
{
flag=t;
break;
}
}
biao[flag]++;
c[flag][biao[flag]]=c[flag][1]+c[i][1];
v[flag][biao[flag]]=v[flag][1]+v[i][1];
if(biao[flag]==3)
{
biao[flag]++;
c[flag][4]=c[flag][2]+c[i][1];
v[flag][4]=v[flag][2]+v[i][1];
}
c[i][1]=0;
v[i][1]=0;
q[i]=0;
}
}
for(int i=1;i<=m;i++)
{
for(int j=n;j>=1;j--)
{
for(int k=1;k<=biao[i];k++)
{
if(j<c[i][k])
{
continue;
}
f[j]=max(f[j],f[j-c[i][k]]+v[i][k]);
}
}
}
for(int i=1;i<=32001;i++)
{
//printf("%d ",f[i]);
if(f[i]>best)
{
best=f[i];
}
}
printf("%d",best);
return 0;
}
复制代码
作者:
walk_alone
时间:
2018-7-28 13:44
#include <cstdio>
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int v[61],p[61],q[61],w[61],prev[61][3],prew[61][3];
int f[32001];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&v[i],&p[i],&q[i]);
if(q[i]==0)
w[i]=p[i]*v[i];
else
{
prew[q[i]][0]++;
prev[q[i]][prew[q[i]][0]]=v[i];
prew[q[i]][prew[q[i]][0]]=v[i]*p[i];
}
}
for(int i=1;i<=m;i++)
for(int j=n;v[i]!=0 && j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
if(j>=v[i]+prev[i][1])
f[j]=max(f[j],f[j-v[i]-prev[i][1]]+w[i]+prew[i][1]);
if(j>=v[i]+prev[i][2])
f[j]=max(f[j],f[j-v[i]-prev[i][2]]+w[i]+prew[i][2]);
if(j>=v[i]+prev[i][1]+prev[i][2])
f[j]=max(f[j],f[j-v[i]-prev[i][1]-prev[i][2]]+w[i]+prew[i][1]+prew[i][2]);
}
printf("%d",f[n]);
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-29 19:38
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstring>
#include <set>
using namespace std;
int main()
{
int f[30005]={0},v[70]={0},fu[70][4]={0},w[70]={0},i,w_all,n;
scanf("%d %d",&w_all,&n);
w_all=w_all/10;
for(i=1;i<=n;i++)
{
int q,w2;
scanf("%d %d %d",&w[i],&q,&w2);
w[i]=w[i]/10;
v[i]=q*w[i];
if(w2>0)
{
fu[w2][3]++;
fu[w2][fu[w2][3]]=i;
fu[i][0]=-1;
}
}
for(i=1;i<=n;i++)
{
if(fu[i][0]==-1) continue;
for(int j=w_all;j>=w[i];j--)
{
f[j]=max(f[j],f[j-w[i]]+v[i]);
if(fu[i][3]==1)
{
if(j-w[i]-w[fu[i][1]]>=0)
f[j]=max(f[j],f[j-w[i]-w[fu[i][1]]]+v[i]+v[fu[i][1]]);
}
if(fu[i][3]==2)
{
if(j-w[i]-w[fu[i][1]]>=0)
f[j]=max(f[i],f[j-w[i]-w[fu[i][1]]]+v[i]+v[fu[i][1]]);
if(j-w[i]-w[fu[i][2]]>=0)
f[j]=max(f[j],f[j-w[i]-w[fu[i][2]]]+v[i]+v[fu[i][2]]);
if(j-w[i]-w[fu[i][1]]-w[fu[i][2]]>=0)
f[j]=max(f[j],f[j-w[i]-w[fu[i][2]]-w[fu[i][1]]]+v[fu[i][2]]+v[i]+v[fu[i][1]]);
}
}
}
printf("%d",f[w_all]*10);
return 0;
}
复制代码
作者:
ZMQ
时间:
2018-8-4 22:10
提示:
作者被禁止或删除 内容自动屏蔽
作者:
倚窗倾听风吹雨
时间:
2018-9-21 17:03
#include<iostream>
using namespace std;
int n,m,num;
int v[65][3],p[65][3],f[3210],map[65];
int main()
{
cin>>n>>m;
n/=10;
for(int i=1; i<=m; i++)
{
int v1,p1,f1;
cin>>v1>>p1>>f1;
v1/=10;
if(!f1)
{
v[++num][0]=v1;
p[num][0]=p1;
map[i]=num;
}
else
{
f1=map[f1];
if(!v[f1][1])
{
v[f1][1]=v1;
p[f1][1]=p1;
}
else
{
v[f1][2]=v1;
p[f1][2]=p1;
}
}
}
for(int i=1; i<=num; i++)
{
for(int j=n; j>=0; j--)
{
if(j>=v[i][0])
f[j]=max(f[j],f[j-v[i][0]]+v[i][0]*p[i][0]);
if(j>=v[i][0]+v[i][1])
f[j]=max(f[j],f[j-v[i][0]-v[i][1]]+v[i][0]*p[i][0]+v[i][1]*p[i][1]);
if(j>=v[i][0]+v[i][2])
f[j]=max(f[j],f[j-v[i][0]-v[i][2]]+v[i][0]*p[i][0]+v[i][2]*p[i][2]);
if(j>=v[i][0]+v[i][1]+v[i][2])
f[j]=max(f[j],f[j-v[i][0]-v[i][1]-v[i][2]]+v[i][0]*p[i][0]+v[i][1]*p[i][1]+v[i][2]*p[i][2]);
}
// cout<<f[n]*10<<endl;
}
cout<<f[n]*10<<endl;
return 0;
}
复制代码
作者:
type尧
时间:
2018-11-6 21:03
//
#include<bits/stdc++.h>
#define maxm 70
#define maxn 32005
using namespace std;
int n,m;
int main_item_price[maxm]; //主件
int main_item_value[maxm];
int item_attached_main_price[maxm][3]; //附件
int item_attached_main_value[maxm][3];
int f[maxn]; //状态
void getdata()
{
int main_or_attached,price,value;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>price>>value>>main_or_attached;
if(!main_or_attached){
main_item_price[i]=price; //这代码可读性太差了
main_item_value[i]=price*value;
}
else{
item_attached_main_price[main_or_attached][0]++;
item_attached_main_price[main_or_attached][item_attached_main_price[main_or_attached][0]]=price;
item_attached_main_value[main_or_attached][item_attached_main_price[main_or_attached][0]]=price*value;
}
}
return;
}
void dp()
{
for(int i=1;i<=m;i++)
for(int j=n;main_item_price[i]!=0&&j>=main_item_price[i];j--){
f[j]=max(f[j],f[j-main_item_price[i]]+main_item_value[i]);
if(j>=main_item_price[i]+item_attached_main_price[i][1])
f[j]=max(f[j],f[j-main_item_price[i]-item_attached_main_price[i][1]]+main_item_value[i]+item_attached_main_value[i][1]);
if(j>=main_item_price[i]+item_attached_main_price[i][2])
f[j]=max(f[j],f[j-main_item_price[i]-item_attached_main_price[i][2]]+main_item_value[i]+item_attached_main_value[i][2]);
if(j>=main_item_price[i]+item_attached_main_price[i][1]+item_attached_main_price[i][2])
f[j]=max(f[j],f[j-main_item_price[i]-item_attached_main_price[i][1]-item_attached_main_price[i][2]]+main_item_value[i]+item_attached_main_value[i][1]+item_attached_main_value[i][2]);
}
return;
}
void print()
{
cout<<f[n];
return;
}
int main()
{
getdata();
dp();
print();
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2