Codeforces 580D Kefa and Dishes(状压DP)

题目大概说要吃掉n个食物里m个,吃掉各个食物都会得到一定的满意度,有些食物如果在某些食物之后吃还会增加满意度,问怎么吃满意度最高。

  • dp[S][i]表示已经吃掉的食物集合是S且刚吃的是第i个食物的最大满意度

。。没什么好说的

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int val[18],pairs[18][18];
 6 long long d[1<<18][18];
 7 
 8 int getCnt(int s){
 9     int cnt=0;
10     for(int i=0; i<18; ++i){
11         if(s>>i&1) ++cnt;
12     }
13     return cnt;
14 }
15 
16 int main(){
17     int n,m,k;
18     scanf("%d%d%d",&n,&m,&k);
19     for(int i=0; i<n; ++i){
20         scanf("%d",val+i);
21     }
22     int a,b,c;
23     while(k--){
24         scanf("%d%d%d",&a,&b,&c);
25         --a; --b;
26         pairs[a][b]=c;
27     }
28     for(int i=0; i<n; ++i){
29         d[1<<i][i]=val[i];
30     }
31     for(int s=0; s<(1<<n); ++s){
32         for(int i=0; i<n; ++i){
33             if((s>>i&1)==0) continue;
34             for(int j=0; j<n; ++j){
35                 if(i==j || (s>>j&1)==0) continue;
36                 d[s][i]=max(d[s][i],d[s^(1<<i)][j]+val[i]+pairs[i][j]);
37             }
38         }
39     }
40     long long res=0;
41     for(int s=0; s<(1<<n); ++s){
42         if(getCnt(s)!=m) continue;
43         for(int i=0; i<n; ++i){
44             res=max(res,d[s][i]);
45         }
46     }
47     printf("%lld",res);
48     return 0;
49 }

 

转载于:https://www.cnblogs.com/WABoss/p/5668138.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值